Что, если Даббо захочет шлюз? Попробуйте интегрировать Spring Cloud Gateway

Dubbo
Что, если Даббо захочет шлюз? Попробуйте интегрировать Spring Cloud Gateway

mark

1. Предпосылки

в микросервисной архитектуреШлюз APIОчень важно, поскольку глобальный вход трафика шлюза это не просто обратный маршрут, более того, необходимо извлечь каждую пограничную услугу (веб-уровень) различных общих потребностей в общедоступной «службе» (шлюз), реализованной, например, проверка подлинности безопасности, контроль доступа, ограничивающий предохранитель, мониторинг, междоменная обработка, документация API агрегации и другие общедоступные функции.

 

вDubboЕсли вы хотите добавить API-шлюз под микросервисную архитектуру, построенную системой фреймворка, если вы не хотите разрабатывать его самостоятельно, в текущем сообществе с открытым исходным кодом почти нет основных шлюзов, поддерживающих протокол dubbo, но есть два очень популярных в системе Spring Cloud Шлюз API с открытым исходным кодомNacosИнтегрироватьSpring Cloud GatewayиDubbo 服务.

 

2. Традиционная архитектура даббо

Dubbo — это вызов RPC, поэтому служба веб-уровня должна быть предоставлена ​​в виде записи http для вызова клиентом, и на ней предоставляются основные функции, такие как аутентификация безопасности, в то время как веб-уровень подключен к обратному прокси-серверу, такому как Nginx для единый вход и балансировка нагрузки.

Веб-уровень обычно делится на бизнес-модули и используется для объединения различных служебных сервисов, от которых зависит бизнес-модуль.

file

PS: Можем ли мы интегрировать все веб-уровни на рисунке выше в шлюз API? (не рекомендуется)

Потому что такой веб-слой не реализованОбобщенный вызовДолжны быть введены API-зависимости всех сервисов dubbo, что сделает шлюз очень нестабильным.Любые изменения интерфейса сервисов должны модифицировать API-зависимости в шлюзе!

 

3. Интегрируйте шлюз Spring Cloud Gateway

Давайте начнем общаться напрямую, чтобы получить самые популярныеSrping Cloud GatewayРеально ли служить шлюзом для системы архитектуры dubbo?Прежде всего, шлюз API является одним из компонентов системы Spring Cloud.Для интеграции dubbo необходимо решить следующие проблемы:

  1. Пройдите через центр регистрации: Spring Cloud Gateway должен обнаруживать нижестоящие службы через центр регистрации, а dubbo также необходимо осуществлять регистрацию и обнаружение служб через центр регистрации.Если два центра регистрации не могут быть подключены, он станет двойным Архитектура регистрационного центра очень сложная!
  2. Преобразование протокола: шлюз использует транспортный протокол http для вызова нижестоящих служб, в то время как служба dubbo по умолчанию использует транспортный протокол tcp.

Первая проблема, упомянутая выше, "пройти через центр регистрации" больше не является проблемой.В настоящее время dubbo поддерживаетZookeeperиNacosДва реестра, и с тех пор Spring Cloud поставил@EnableEurekaClientизменить на@EnableDiscoveryClientПосле этого все основные центры регистрации были в основном поддерживаются, эта статья будет использоватьNacosДействуйте как реестр, чтобы пройти через оба

 

3.1 Способ 1

Поместите традиционную архитектуру даббо вNginxзаменитьSpring Cloud Gateway, и положи安全认证Такие общие функции перенесены на шлюз для реализации

mark

Поскольку сама служба веб-слоя предоставляет интерфейс HTTP, слой шлюза не должен выполнять преобразование протокола, но из-за安全认证Переместившись вперед к шлюзу, необходимо предотвратить веб-уровень, стоящий за прямым запросом, в обход шлюза с помощью сетевой изоляции.

 

3.2. Способ 2

Доработан или добавлен сам сервис dubborestПоддержка транспортного протокола, чтобы шлюз мог взаимодействовать со службой dubbo через транспортный протокол http.

Транспортный протокол Rest: поддержка вызовов REST на основе стандартного Java REST API — JAX-RS 2.0 (сокращение от Java API для RESTful Web Services).

mark

Текущая версия Dubbo уже поддерживает 10 протоколов передачи, таких как Dubbo, REST, RMI, Hessian, HTTP, WebService, Rebift, Redis и т. Д., а также поддерживает ту же услугу для определения нескольких протоколов одновременно, таких как протокол конфигурации. = {"Дуббо", "Отдых"} Тогда служба поддерживает обаdubboиrestДва транспортных протокола

 

3.3. Резюме

метод первыйВ сравненииСпособ 2Многоуровневая веб-служба требует больших затрат на сетевые вызовы, но преимущество явно заключается в том, что соответствующие обязанности одного веб-уровня могут использоваться в качестве услуг агрегации результатов полимерного уровня посредством обработки интеграции нескольких служб, что возвращается на передний план вместе, поэтому это под архитектурой может значительно сократить количество услугкруговая зависимость

 

4. Практика кодекса

зависимая среда

  • lombok
  • jdk 1.8
  • Nacos 1.3
  • Spring Boot 2.2.8.RELEASE
  • Spring Cloud Hoxton.SR5
  • Spring Cloud Alibaba 2.2.1.RELEASE

 

в корневом каталогеpom.xmlОпределите глобальную версию зависимости в

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>8</java.version>

        <spring-boot-dependencies.version>2.2.8.RELEASE</spring-boot-dependencies.version>
        <spring-cloud-dependencies.version>Hoxton.SR5</spring-cloud-dependencies.version>
        <spring-cloud-alibaba-dependencies.version>2.2.1.RELEASE</spring-cloud-alibaba-dependencies.version>
        <jaxrs.version>3.12.1.Final</jaxrs.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

4.1. Создайте проект dubbo-api

Определите два интерфейса API соответственно

Служба DubboService, использующая протокол dubbo

public interface DubboService {
    String test(String param);
}

RestService использует службу протокола остальных

public interface RestService {
    String test(String param);
}

 

4.2. Создать проект web-dubbo

использоватьметод первыйИнтеграция стыковочного шлюза Чтобы упростить использование логических уровней для определения уровня контроллера и уровня службы в рамках одной и той же службы, нет разделения службы.

4.2.1 Создание конфигурации

Определить конфигурацию весенней загрузки

server:
  port: 8081

spring:
  application:
    name: zlt-web-dubbo
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      server-addr: 192.168.28.130:8848
      username: nacos
      password: nacos

server.port: настроить порты, предоставляемые сервером приложений

spring.cloud.nacos: Настройте соответствующие параметры центра регистрации весеннего облака, конфигурацию nacos необходимо изменить на соответствующую среду.

Определить конфигурацию dubbo

dubbo:
  scan:
    base-packages: org.zlt.service
  protocols:
    dubbo:
      name: dubbo
      port: -1
  registry:
    address: spring-cloud://localhost
  consumer:
    timeout: 5000
    check: false
    retries: 0
  cloud:
    subscribed-services:

dubbo.scan.base-packages: Указывает тестовый пакет сканирования класса реализации службы Dubbo.

dubbo.protocols: конфигурация протокола, предоставляемая службой, с подсвойствами.nameимя протокола,portпорт протокола (-1 означает порт с автоинкрементом, начиная с 20880)

dubbo.registry.address: конфигурация реестра службы Dubbo, в которой подсвойстваaddressЗначение «spring-cloud://localhost» указывает, что он подключен к реестру Spring Cloud.

 

4.2.2 Создайте класс реализации DubboService

пройти черезprotocol = "dubbo"указанное использованиеdubbo协议определить услугу

@Service(protocol = "dubbo")
public class DubboServiceImpl implements DubboService {
    @Override
    public String test(String param) {
        return "dubbo service: " + param;
    }
}

 

4.2.3 Создание класса контроллера

использоватьSpring Bootиз@RestControllerАннотации определяют веб-сервисы

@RestController
public class WebController {
    @Autowired
    private DubboService dubboService;

    @GetMapping("/test/{p}")
    public String test(@PathVariable("p") String param) {
        return dubboService.test(param);
    }
}

 

4.3. Создать проект rest-dubbo

использоватьСпособ 2Интегрируйте док-шлюз.Поскольку служба создает остальную службу через dubbo, нет необходимости использовать встроенную службу приложений Spring Boot.

4.3.1 Создание конфигурации

Определить конфигурацию весенней загрузки

spring:
  application:
    name: zlt-rest-dubbo
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      server-addr: 192.168.28.130:8848
      username: nacos
      password: nacos

Поскольку встроенные сервисы приложений Spring Boot не используются, здесь нет необходимости указыватьserver.port

Определить конфигурацию dubbo

dubbo:
  scan:
    base-packages: org.zlt.service
  protocols:
    dubbo:
      name: dubbo
      port: -1
    rest:
      name: rest
      port: 8080
      server: netty
  registry:
    address: spring-cloud://localhost
  consumer:
    timeout: 5000
    check: false
    retries: 0
  cloud:
    subscribed-services:

dubbo.protocols: настроить два протокола, где оставшийся протокол определяет порт 8080 и использует netty в качестве сервера приложений.

 

4.3.2 Создайте класс реализации RestService

пройти черезprotocol = "rest"указанное использованиеrest协议определить услугу

@Service(protocol = "rest")
@Path("/")
public class RestServiceImpl implements RestService {
    @Override
    @Path("test/{p}")
    @GET
    public String test(@PathParam("p") String param) {
        return "rest service: " + param;
    }
}

 

4.4 Создайте проект Spring Cloud Gateway

Определить конфигурацию весенней загрузки

server:
  port: 9900

spring:
  application:
    name: sc-gateway
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      server-addr: 192.168.28.130:8848
      username: nacos
      password: nacos

server.port: Определите порт шлюза как 9090.

Определить конфигурацию шлюза

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        - id: web
          uri: lb://zlt-web-dubbo
          predicates:
            - Path=/api-web/**
          filters:
            - StripPrefix=1
        - id: rest
          uri: lb://zlt-rest-dubbo
          predicates:
            - Path=/api-rest/**
          filters:
            - StripPrefix=1

Определите две политики маршрутизации соответственно:

  • дорожка/api-web/по запросуweb-dubboпроект
  • дорожка/api-rest/по запросуrest-dubboпроект

 

4.5 Тестирование

Начните отдельно: проекты Nacos, sc-gateway, web-dubbo, rest-dubbo и протестируйте два метода интеграции через следующие два интерфейса шлюза.

  1. http://127.0.0.1:9900/api-web/test/abc:проситьweb-dubboПервый метод интеграции инженерных тестов
  2. http://127.0.0.1:9900/api-rest/test/abc:проситьrest-dubboСпособ интеграции инженерных тестов 2

 

Пять, скачать демо

Иде нужно установитьlombokплагин

GitHub.com/Два дня 2000/Азартные игры…

  Отсканируйте код, чтобы следовать за сюрпризом!

file