1. Предпосылки
в микросервисной архитектуреШлюз APIОчень важно, поскольку глобальный вход трафика шлюза это не просто обратный маршрут, более того, необходимо извлечь каждую пограничную услугу (веб-уровень) различных общих потребностей в общедоступной «службе» (шлюз), реализованной, например, проверка подлинности безопасности, контроль доступа, ограничивающий предохранитель, мониторинг, междоменная обработка, документация API агрегации и другие общедоступные функции.
вDubboЕсли вы хотите добавить API-шлюз под микросервисную архитектуру, построенную системой фреймворка, если вы не хотите разрабатывать его самостоятельно, в текущем сообществе с открытым исходным кодом почти нет основных шлюзов, поддерживающих протокол dubbo, но есть два очень популярных в системе Spring Cloud Шлюз API с открытым исходным кодомNacos
ИнтегрироватьSpring Cloud Gateway
иDubbo 服务
.
2. Традиционная архитектура даббо
Dubbo — это вызов RPC, поэтому служба веб-уровня должна быть предоставлена в виде записи http для вызова клиентом, и на ней предоставляются основные функции, такие как аутентификация безопасности, в то время как веб-уровень подключен к обратному прокси-серверу, такому как Nginx для единый вход и балансировка нагрузки.
Веб-уровень обычно делится на бизнес-модули и используется для объединения различных служебных сервисов, от которых зависит бизнес-модуль.
PS: Можем ли мы интегрировать все веб-уровни на рисунке выше в шлюз API? (не рекомендуется)
Потому что такой веб-слой не реализованОбобщенный вызовДолжны быть введены API-зависимости всех сервисов dubbo, что сделает шлюз очень нестабильным.Любые изменения интерфейса сервисов должны модифицировать API-зависимости в шлюзе!
3. Интегрируйте шлюз Spring Cloud Gateway
Давайте начнем общаться напрямую, чтобы получить самые популярныеSrping Cloud Gateway
Реально ли служить шлюзом для системы архитектуры dubbo?Прежде всего, шлюз API является одним из компонентов системы Spring Cloud.Для интеграции dubbo необходимо решить следующие проблемы:
- Пройдите через центр регистрации: Spring Cloud Gateway должен обнаруживать нижестоящие службы через центр регистрации, а dubbo также необходимо осуществлять регистрацию и обнаружение служб через центр регистрации.Если два центра регистрации не могут быть подключены, он станет двойным Архитектура регистрационного центра очень сложная!
- Преобразование протокола: шлюз использует транспортный протокол http для вызова нижестоящих служб, в то время как служба dubbo по умолчанию использует транспортный протокол tcp.
Первая проблема, упомянутая выше, "пройти через центр регистрации" больше не является проблемой.В настоящее время dubbo поддерживает
Zookeeper
иNacos
Два реестра, и с тех пор Spring Cloud поставил@EnableEurekaClient
изменить на@EnableDiscoveryClient
После этого все основные центры регистрации были в основном поддерживаются, эта статья будет использоватьNacos
Действуйте как реестр, чтобы пройти через оба
3.1 Способ 1
Поместите традиционную архитектуру даббо вNginx
заменитьSpring Cloud Gateway
, и положи安全认证
Такие общие функции перенесены на шлюз для реализации
Поскольку сама служба веб-слоя предоставляет интерфейс HTTP, слой шлюза не должен выполнять преобразование протокола, но из-за
安全认证
Переместившись вперед к шлюзу, необходимо предотвратить веб-уровень, стоящий за прямым запросом, в обход шлюза с помощью сетевой изоляции.
3.2. Способ 2
Доработан или добавлен сам сервис dubborest
Поддержка транспортного протокола, чтобы шлюз мог взаимодействовать со службой dubbo через транспортный протокол http.
Транспортный протокол Rest: поддержка вызовов REST на основе стандартного Java REST API — JAX-RS 2.0 (сокращение от Java API для RESTful Web Services).
Текущая версия 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 и протестируйте два метода интеграции через следующие два интерфейса шлюза.
-
http://127.0.0.1:9900/api-web/test/abc:просить
web-dubbo
Первый метод интеграции инженерных тестов -
http://127.0.0.1:9900/api-rest/test/abc:просить
rest-dubbo
Способ интеграции инженерных тестов 2
Пять, скачать демо
Иде нужно установитьlombok
плагин
GitHub.com/Два дня 2000/Азартные игры…
Отсканируйте код, чтобы следовать за сюрпризом!