предисловие
Предыдущие блоги были посвященыApache Thrift
Использование и принцип введены. Сегодня, когда микросервисная архитектура популярна, думать о ней естественно.Spring Boot
иSpring Cloud
в видеМикросервисыбазовый каркас. Тем не мение,Spring Cloud
С момента своего создания на основеHTTP
протоколлегкийRestful API
как средство связи между службами.
В дизайне микросервисной архитектуры ее можно разделить навнешняя службаиВнутренний сервис. Основные различия между ними:
-
внешняя служба: на основе
Restful
СтильHTTP
соглашение, черезЭкстранетПредоставлять услуги внешнему миру, условно говоряпростой и универсальный. -
Внутренний сервис: на основе
RPC
сообщение сообщениеTCP/IP
договор, предоставитьИнтранетмежсервисные вызовы для достиженияуменьшить пропускную способность,уменьшить задержку,Улучшить производительность.
Некоторые сценарии применения, особенноВнутренний сервисЕсли его нужно вызывать часто, необходимо подумать, нужно ли его преобразовывать вRPC
сбыватьсяУвеличение пропускной способностииПроизводительность системы, сказатьСлужба аутентификацииодин тип.
текст
Кратко
скачатьspring-cloud-starter-thrift
и импортироватьIDEA
Среда разработки, адрес проекта:GitHub.com/O — арендатор/билеты…
spring-cloud-starter-thrift
поставкаSpring Cloud
правильнорегулируемыйизкросс языкструктура вызова службыApache Thrift
упаковка и интеграция.
spring-cloud-starter-thrift
включаютклиентspring-cloud-starter-thrift-client
иСерверspring-cloud-starter-thrift-server
два модуля. иspring-cloud-starter-thrift-examples
подмодуль обеспечивает3
примеры проектов:calculator
,deposit
иtest
.
- calculator: Простой пример запуска проекта.
- deposit: Пример сложного бизнес-сценария проекта.
- test: Пример проекта тестирования производительности.
Сервер
- служба поддержки
Apache Thrift
различные родныемодель обслуживания потоков,включаютМодель блокировки одного потока(simple
),Однопоточная неблокирующая модель(nonBlocking
),Модель блокировки пула потоков(threadPool
),Полусинхронная и полуасинхронная модель(hsHa
)имодель селектора нити(threadedSelector
). - служба поддержки
Apache Thrift 0.10.0
предоставляется после версиимультиплексор, который предоставляет унифицированные функции управления регистрацией для служб. - поддерживаетсяслужебная подпись(Служить
ID
+ клиентStub
имя интерфейса + номер версии службы) однозначно идентифицирует службуStub
изконкретный класс реализации, который поддерживает сервисную версиюПлавное обновление. - служба поддержки
Server Group
из режима запуска, каждыйЭкземпляр службыМожно открыть несколькоThrift Server
, через разныеНомер портавыставлены клиентам.
клиент
- поддерживаетсяслужебная подпись(Служить
ID
+ клиентStub
имя интерфейса + номер версии службы) однозначно идентифицирует и вызывает серверStub
конкретный класс реализации. - служба поддержки
Apache Thrift
изTransport
слоистыйУправление пулом соединений,уменьшатьмежду клиентом и серверомсоединятьчастыхСоздайтеиразрушать. - Поддержка с
Spring Cloud Consul
изПолная интеграция, клиент проходитОбнаружение сердцебиенияиРеестр услугConsul
Keep-alive, динамически синхронизированныйОбновить список услуг,мониторУслугивключить,закрытиеисостояние здоровья. - служба поддержкиБалансировка клиентской нагрузки,включаютслучайный,голосованиеСтратегия балансировки нагрузки клиента
Thrift
программа через локалкусписок сервисного кэшаРеализовать динамическую переадресацию звонков.
Начать быстро
Структура проекта:
- calculator
- calculator-client
- calculator-iface
- calculator-server
spring-cloud-starter-thrift
использует0.10.0
версияthrift
. отcalculator
Проект стартует, во-первых, черезThrift IDL
(Язык описания интерфейса) writeклиентская заглушкаStub
иСкелет сервераSkeleton
,пройти через.thrift
Файл определяет спецификацию интерфейса.
Введите первыйspring-cloud-starter-thrift
Корневая директория,pom.xml
Определяется следующим образом:
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>calculator-client</module>
<module>calculator-server</module>
<module>calculator-iface</module>
</modules>
<artifactId>calculator</artifactId>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</spring-cloud.version>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</build>
упаковать проект иУстановитьк местномуMaven
склад:
mvn clean install
Экономное написание IDL
namespace java com.icekredit.rpc.thrift.example
service CalculatorService {
i32 add(1: i32 arg1, 2: i32 arg2)
i32 subtract(1: i32 arg1, 2: i32 arg2)
i32 multiply(1: i32 arg1, 2: i32 arg2)
i32 division(1: i32 arg1, 2: i32 arg2)
}
Загрузить и установить0.10.0
изThrift IDL
генератор компиляции,ссылка для скачивания:thrift.apache.org/docs/INS he l…. пройти черезпереводчикгенерировать.java
изStub
файл класса.
thrift -gen java ./CalculatorService.thrift
сгенерированный компиляторомCalculatorService.java
документ.CalculatorService.java
Есть тысячи строк кода. Для разработчиков просто сосредоточьтесь на следующемЧетыре основных интерфейса/класса:Iface
,AsyncIface
,Client
иAsyncClient
.
-
Iface:Серверпутем реализации
HelloWorldService.Iface
интерфейс, кклиентпредоставить конкретныеСинхронизироватьЛогика бизнеса. -
AsyncIface:Серверпутем реализации
HelloWorldService.Iface
интерфейс, кклиентпредоставить конкретныеасинхронныйЛогика бизнеса. -
Client:клиентпройти через
HelloWorldService.Client
объект экземпляра дляСинхронизироватьПутьсервер доступаспособ предоставления услуги. -
AsyncClient:клиентпройти через
HelloWorldService.AsyncClient
объект экземпляра дляасинхронныйПутьсервер доступаспособ предоставления услуги.
Промежуточный контракт (калькулятор-iface)
существуетМодуль промежуточного контрактавводитьthrift
изmaven
Зависимость, скопируйте предыдущий шагthrift
компилируется генераторомCalculatorService
исходные файлы в этот модуль.
pom.xml
<parent>
<artifactId>calculator</artifactId>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>calculator-iface</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.10.0</version>
</dependency>
</dependencies>
Сервер (калькулятор-сервер)
существуетсерверный модульВводить:
-
spring-cloud-starter-thrift-server:
thrift
серверная частьstarter
программа. -
calculator-iface: Промежуточный контрактный модуль, здесь как каркас сервера (
Skeleton
) программа.
pom.xml
<parent>
<artifactId>calculator</artifactId>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>calculator-server</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.icekredit.rpc.thrift</groupId>
<artifactId>spring-cloud-starter-thrift-server</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<artifactId>calculator-iface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
существуетapplication.yml
Средняя конфигурацияthrift
Параметры работы сервера:
application.yml
## 服务端Restful服务所在的HTTP端口号
server:
port: 8080
## 用于Consul健康检查
endpoints:
actuator:
sensitive: false
enabled: true
management:
security:
enabled: false
## Spring Thrift服务端配置
spring:
thrift:
server:
service-id: thrift-rpc-calculator ##
service-model: hsHa ## 半同步/半异步服务模型
port: 25000 ## 服务端RPC服务所在的TCP端口号
worker-queue-capacity: 1000
## 半同步/半异步服务模型参数配置
hs-ha:
min-worker-threads: 5 ## 最少工作线程数
max-worker-threads: 20 ## 最大工作线程数
keep-alived-time: 3 ## 空闲线程存活时间
выполнитьThrift IDL
сгенерированный скелет (Skeleton
)своего родаCalculatorService
внутренний интерфейсIface
, напишите конкретную бизнес-логику:
Несколько замечаний:
- выполнить
CalculatorService.Iface
интерфейс. - Тег класса реализации
@ThriftService
Аннотация со следующими свойствами:-
name:пройти через
name
логотипнаименование услуги, который по умолчанию равенимена классов в нижнем регистре. -
version:пройти через
version
логотипСервисная версия, по умолчанию1.0
, то есть тот самыйнаименование услугимогу иметьРеализации нескольких версий.
-
name:пройти через
RpcCalculatorService.java
@ThriftService(name = "rpcCalculatorService", version = 2.0)
public class RpcCalculatorService implements CalculatorService.Iface {
@Override
public int add(int arg1, int arg2) {
BigDecimal arg1Decimal = new BigDecimal(arg1);
BigDecimal arg2Decimal = new BigDecimal(arg2);
return arg1Decimal.add(arg2Decimal).intValue();
}
@Override
public int subtract(int arg1, int arg2) {
BigDecimal arg1Decimal = new BigDecimal(arg1);
BigDecimal arg2Decimal = new BigDecimal(arg2);
return arg1Decimal.subtract(arg2Decimal).intValue();
}
@Override
public int multiply(int arg1, int arg2) {
BigDecimal arg1Decimal = new BigDecimal(arg1);
BigDecimal arg2Decimal = new BigDecimal(arg2);
return arg1Decimal.multiply(arg2Decimal).intValue();
}
@Override
public int division(int arg1, int arg2) {
BigDecimal arg1Decimal = new BigDecimal(arg1);
BigDecimal arg2Decimal = new BigDecimal(arg2);
return arg1Decimal.divide(arg2Decimal).intValue();
}
}
Упакуйте серверную программу:
mvn clean package -Dmaven.test.skip=true
написатьDockerfile
документ:
FROM openjdk:8-jdk-alpine
ADD target/spring-boot-thrift-server-0.0.1-SNAPSHOT.jar calculator-server.jar
ENTRYPOINT ["java", "-jar", "calculator-server.jar"]
будетDockerfile
иtarget/spring-boot-thrift-server-0.0.1-SNAPSHOT.jar
Скопировать на сервер, собратьThrift Server
сервисное изображение:
docker build . -t icekredit/calculator-server
Клиент (калькулятор-клиент)
существуетклиентский модульВводить:
-
spring-cloud-starter-thrift-client:
thrift
клиентаstarter
программа. -
calculator-iface: Промежуточный контрактный модуль, здесь как клиентская заглушка (
Stub
) программа.
pom.xml
<parent>
<artifactId>calculator</artifactId>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>calculator-client</artifactId>
<dependencies>
<dependency>
<groupId>com.icekredit.rpc.thrift</groupId>
<artifactId>spring-cloud-starter-thrift-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<artifactId>calculator-iface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
существуетapplication.yml
Средняя конфигурацияthrift
клиентРабочие параметры должны быть объединены сСерверКонфигурация остается прежней:
## 客户端Restful服务所在的HTTP端口号
server:
port: 8080
## 用于Consul健康检查
endpoints:
actuator:
sensitive: false
enabled: true
management:
security:
enabled: false
## Spring Thrift客户端配置(Thrift Client的自动配置取决于Spring Cloud Consul的正确配置)
spring:
application:
name: thrift-calculator-client
cloud:
consul:
host: 192.168.91.128 ## Consul的IP地址
port: 8500 ## Consul的HTTP端口号
discovery:
register: false ## 不使用SpringCloud提供的基于服务的程序注册方式
register-health-check: false ## 不使用Spring Cloud进行健康检查
retry:
max-attempts: 3
max-interval: 2000
## Thrift Client配置
thrift:
client:
package-to-scan: com.icekredit.rpc.thrift.example.rpc ## 标记由有注解@ThriftClient接口的包路径
service-model: hsHa ##服务线程模型(这里必须与服务端保持一致, 默认都是hsHa)
## 客户端连接池配置
pool:
retry-times: 3 ## 异常失败,连接超时后的重试次数
## key由IP + Port组成,唯一标识一个服务实例
pool-max-total-per-key: 200 ## 客户端保持的最大连接数,包含不同的服务和服务实例
pool-min-idle-per-key: 10 ## 每个服务实例最小的空闲连接数
pool-max-idle-per-key: 40 ## 每个服务实例最大的空闲连接数
pool-max-wait: 30000 ## 空闲连接最大存活时间
connect-timeout: 2000 ## 连接超时时间
написатьThrift Client
изИнтерфейс клиентского прокси, здесь есть две оговорки:
- Интерфейс должен наследоваться отродительский интерфейс
ThriftClientAware
,иThriftClientAware
внутреннийобщий параметрЗаполните какThrift IDL
СгенерированоStub
своего родаCalculatorService
серединаClient
внутренний класс. - Интерфейс должен быть идентифицирован
@ThriftClient
аннотация,@ThriftClient
Содержит следующие свойства:-
serviceId: этот клиентский прокси-интерфейс привязан к
Thrift
СерверизИдентификатор регистрации службы(с серверомбыть последовательным). -
refer: клиентская заглушка
Stub
типа вот напримерCalculatorService.class
. -
version: конкретный класс бизнес-реализацииномер версии(Если вы не заполните, по умолчанию
1.0
), необходимо связаться с серверомбыть последовательным.
-
serviceId: этот клиентский прокси-интерфейс привязан к
CalculatorThriftClient.java
@ThriftClient(serviceId = "thrift-rpc-calculator", refer = CalculatorService.class, version = 2.0)
public interface CalculatorThriftClient extends ThriftClientAware<CalculatorService.Client> {
}
использовать аннотации@ThriftReferer
, на стороне клиентаController
инъекцияCalculatorThriftClient
. При использовании, поCalculatorThriftClient.thriftClient()
метод, вы можете позвонитьThrift Server
сервисный метод.
RpcCalculatorController.java
@RestController
@RequestMapping("/rpc")
public class RpcCalculatorController {
@ThriftReferer
private CalculatorThriftClient calculators;
@GetMapping("/add")
public int add(@RequestParam("arg1") int arg1, @RequestParam("arg2") int arg2) throws Exception {
return calculators.client().add(arg1, arg2);
}
@GetMapping("/subtract")
public int subtract(@RequestParam("arg1") int arg1, @RequestParam("arg2") int arg2) throws Exception {
return calculators.client().subtract(arg1, arg2);
}
@GetMapping("/multiply")
public int multiply(@RequestParam("arg1") int arg1, @RequestParam("arg2") int arg2) throws Exception {
return calculators.client().multiply(arg1, arg2);
}
@GetMapping("/division")
public int division(@RequestParam("arg1") int arg1, @RequestParam("arg2") int arg2) throws Exception {
return calculators.client().division(arg1, arg2);
}
}
легко проверить, влокальная среда разработкинастроитьConsul
адрес, бегклиентская программаВот и все. законтейнерная средаПротестируйте, настройте для упаковки клиентской программы:
mvn clean package -Dmaven.test.skip=true
написатьDockerfile
документ:
FROM openjdk:8-jdk-alpine
ADD target/spring-boot-thrift-client-0.0.1-SNAPSHOT.jar calculator-client.jar
ENTRYPOINT ["java", "-jar", "calculator-client.jar"]
будетDockerfile
иtarget/spring-boot-thrift-client-0.0.1-SNAPSHOT.jar
Скопировать на сервер, собратьThrift Client
сервисное изображение:
docker build . -t icekredit/calculator-client
простой тест
Публикация серверной программы
Для облегчения тестирования запустите три на одном хостеThrift Server
изdocker
контейнеры в разныхпортОтличить, указать соответствующийНомер портаиConsul
сообщение о регистрации:
Thrift Server
Пример 1 (25001
порт):
docker run -d -p 8081:8080 -p 25001:25000 --name calculator-server-01 \
-e "SERVICE_25000_NAME=thrift-rpc-calculator" \
-e "SERVICE_25000_CHECK_TCP=/" \
-e "SERVICE_25000_CHECK_INTERVAL=30s" \
-e "SERVICE_25000_CHECK_TIMEOUT=3s" \
-e "SERVICE_25000_TAGS=thrift-rpc-calculator-25001" \
icekredit/calculator-server
Thrift Server
Пример 2 (25002
порт):
docker run -d -p 8081:8080 -p 25002:25000 --name calculator-server-01 \
-e "SERVICE_25000_NAME=thrift-rpc-calculator" \
-e "SERVICE_25000_CHECK_TCP=/" \
-e "SERVICE_25000_CHECK_INTERVAL=30s" \
-e "SERVICE_25000_CHECK_TIMEOUT=3s" \
-e "SERVICE_25000_TAGS=thrift-rpc-calculator-25002" \
icekredit/calculator-server
Thrift Server
Пример 3 (25003
порт):
docker run -d -p 8081:8080 -p 25003:25000 --name calculator-server-01 \
-e "SERVICE_25000_NAME=thrift-rpc-calculator" \
-e "SERVICE_25000_CHECK_TCP=/" \
-e "SERVICE_25000_CHECK_INTERVAL=30s" \
-e "SERVICE_25000_CHECK_TIMEOUT=3s" \
-e "SERVICE_25000_TAGS=thrift-rpc-calculator-25003" \
icekredit/calculator-server
Просмотрите журнал запуска каждого контейнера, если он содержит следующеенесколько строк вывода, это показывает, чтоThrift Server
Запущен успешно и обслуживается нормальноRPC
Служить.
2017-11-19 22:28:47.779 INFO 12960 --- [ main] c.i.r.t.s.context.ThriftServerContext : Build thrift server from HsHaServerContext
2017-11-19 22:28:47.820 INFO 12960 --- [ main] c.i.r.t.s.p.TRegisterProcessorFactory : Processor bean org.ostenant.springboot.learning.examples.CalculatorService$Processor@445bce9a with signature [thrift-rpc-calculator$org.ostenant.springboot.learning.examples.CalculatorService$2.0] is instantiated
2017-11-19 22:28:47.822 INFO 12960 --- [ main] c.i.r.t.s.p.TRegisterProcessorFactory : Single processor org.ostenant.springboot.learning.examples.CalculatorService$Processor@445bce9a register onto multiplexed processor with signature [thrift-rpc-calculator$org.ostenant.springboot.learning.examples.CalculatorService$2.0]
2017-11-19 22:28:47.822 INFO 12960 --- [ main] c.i.r.t.s.p.TRegisterProcessorFactory : Multiplexed processor totally owns 1 service processors
запускатьConsul
иRegistrator
контейнер,Thrift Server
Три экземпляра службы успешно зарегистрированы вConsul
Список услуг:
СвязанныйConsul
иRegistrator
Для установки, настройки и использования, пожалуйста, обратитесь к:Docker+Consul+Registrator (1) Создание кластера обнаружения и регистрации сервисов!
Программа сервера работает успешно,Thrift RPC
Сервис запускается нормально!
Запустите клиентскую программу
локально8080
начало номера портаThrift
Клиент после нормального запуска наблюдает за журналом запуска следующим образом:
2017-11-20 11:00:20.025 INFO 4052 --- [ main] .r.t.c.ThriftClientBeanScannerConfigurer : Base package org.ostenant.springboot.learning.examples.rpc is to be scanned with com.icekredit.rpc.thrift.client.scanner.ThriftClientBeanScanner@37496720
2017-11-20 11:00:20.029 INFO 4052 --- [ main] c.i.r.t.c.s.ThriftClientBeanScanner : Packages scanned by thriftClientBeanDefinitionScanner is [org.ostenant.springboot.learning.examples.rpc]
2017-11-20 11:00:20.029 INFO 4052 --- [ main] c.i.r.t.c.s.ThriftClientBeanScanner : Scanned and found thrift client, bean calculatorThriftClient assigned from org.ostenant.springboot.learning.examples.rpc.CalculatorThriftClient
2017-11-20 11:00:20.050 INFO 4052 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2017-11-20 11:00:20.134 INFO 4052 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.ostenant.springboot.learning.examples.rest.CalculatorFeignClient' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-11-20 11:00:20.136 WARN 4052 --- [ main] c.i.r.t.c.s.ThriftClientFactoryBean : Bean class is not found
2017-11-20 11:00:20.142 INFO 4052 --- [ main] c.i.r.t.c.s.ThriftClientFactoryBean : Succeed to instantiate an instance of ThriftClientFactoryBean: com.icekredit.rpc.thrift.client.scanner.ThriftClientFactoryBean@7bac686b
2017-11-20 11:00:20.142 INFO 4052 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'calculatorThriftClient' of type [com.icekredit.rpc.thrift.client.scanner.ThriftClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-11-20 11:00:20.411 INFO 4052 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.netflix.metrics.MetricsInterceptorConfiguration$MetricsRestTemplateConfiguration' of type [org.springframework.cloud.netflix.metrics.MetricsInterceptorConfiguration$MetricsRestTemplateConfiguration$$EnhancerBySpringCGLIB$$a9ef18dc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-11-20 11:00:20.423 INFO 4052 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$93dc7598] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-11-20 11:00:21.592 INFO 4052 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
Во время запуска все теги аннотируются@ThriftClient
Интерфейсы генерируютсяпрокси-объект, и через аннотацию@ThriftReferer
вводить вController
середина.
в то же время,клиентоткрывается при запускеServerUpdater
,Динамика времениидтиConsul
Очистка списка регистраций сервисовИнформация об исправном сервисном узле, кэшировано вСписок местных услугсередина.
2017-11-20 11:02:26.726 INFO 4052 --- [erListUpdater-0] t.c.l.ThriftConsulServerListLoadBalancer : Refreshed thrift serverList: [thrift-rpc-calculator: [ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25001], host='192.168.91.128', port=25001, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25002], host='192.168.91.128', port=25002, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25003], host='192.168.91.128', port=25003, address='192.168.91.128', isHealth=true}], consul-8301: [ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=8301, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=9301, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=10301, address='192.168.91.128', isHealth=true}], consul-8302: [ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=8302, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=9302, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=10302, address='192.168.91.128', isHealth=true}], thrift-rest-calculator: [ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8081], host='192.168.91.128', port=8081, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8082], host='192.168.91.128', port=8082, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8083], host='192.168.91.128', port=8083, address='192.168.91.128', isHealth=true}]]
2017-11-20 11:02:56.752 INFO 4052 --- [erListUpdater-0] t.c.l.ThriftConsulServerListLoadBalancer : Refreshed thrift serverList: [thrift-rpc-calculator: [ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25001], host='192.168.91.128', port=25001, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25002], host='192.168.91.128', port=25002, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25003], host='192.168.91.128', port=25003, address='192.168.91.128', isHealth=true}], consul-8301: [ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=8301, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=9301, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=10301, address='192.168.91.128', isHealth=true}], consul-8302: [ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=8302, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=9302, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=10302, address='192.168.91.128', isHealth=true}], thrift-rest-calculator: [ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8081], host='192.168.91.128', port=8081, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8082], host='192.168.91.128', port=8082, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8083], host='192.168.91.128', port=8083, address='192.168.91.128', isHealth=true}]]
2017-11-20 11:03:26.764 INFO 4052 --- [erListUpdater-0] t.c.l.ThriftConsulServerListLoadBalancer : Refreshed thrift serverList: [thrift-rpc-calculator: [ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25001], host='192.168.91.128', port=25001, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25002], host='192.168.91.128', port=25002, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rpc-calculator', tags=[thrift-rpc-calculator-25003], host='192.168.91.128', port=25003, address='192.168.91.128', isHealth=true}], consul-8301: [ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=8301, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=9301, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8301', tags=[udp], host='192.168.91.128', port=10301, address='192.168.91.128', isHealth=true}], consul-8302: [ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=8302, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=9302, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='consul-8302', tags=[udp], host='192.168.91.128', port=10302, address='192.168.91.128', isHealth=true}], thrift-rest-calculator: [ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8081], host='192.168.91.128', port=8081, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8082], host='192.168.91.128', port=8082, address='192.168.91.128', isHealth=true}, ThriftServerNode{node='node1', serviceId='thrift-rest-calculator', tags=[thrift-rest-calculator-8083], host='192.168.91.128', port=8083, address='192.168.91.128', isHealth=true}]]
посетить местныйThrift
Клиент:
адрес | Аргумент arg1 | Аргумент arg2 | вывод страницы |
---|---|---|---|
/rpc/add | 200 | 100 | 300 |
/rpc/subtract | 200 | 100 | 100 |
/rpc/multiply | 200 | 100 | 20000 |
/rpc/division | 200 | 100 | 2 |
Суммировать
В этой статье кратко описано, как использоватьstarter
будетApache Thrift
интегрирован вSpring Cloud
, для более сложных сценариев применения иstarter
Внутренний дизайн и принципы реализации будут подробно описаны шаг за шагом в будущем!
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.