предисловие
Предыдущие блоги были посвящены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изПолная интеграция, клиент проходитОбнаружение сердцебиенияиРеестр услугConsulKeep-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
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.