Spring Cloud интегрирует Thrift RPC (1) — руководство по использованию

Java задняя часть сервер Spring

предисловие

Предыдущие блоги были посвящены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: Пример проекта тестирования производительности.

Сервер

  1. служба поддержкиApache Thriftразличные родныемодель обслуживания потоков,включаютМодель блокировки одного потока(simple),Однопоточная неблокирующая модель(nonBlocking),Модель блокировки пула потоков(threadPool),Полусинхронная и полуасинхронная модель(hsHaмодель селектора нити(threadedSelector).
  2. служба поддержкиApache Thrift 0.10.0предоставляется после версиимультиплексор, который предоставляет унифицированные функции управления регистрацией для служб.
  3. поддерживаетсяслужебная подпись(СлужитьID+ клиентStubимя интерфейса + номер версии службы) однозначно идентифицирует службуStubизконкретный класс реализации, который поддерживает сервисную версиюПлавное обновление.
  4. служба поддержкиServer Groupиз режима запуска, каждыйЭкземпляр службыМожно открыть несколькоThrift Server, через разныеНомер портавыставлены клиентам.

клиент

  1. поддерживаетсяслужебная подпись(СлужитьID+ клиентStubимя интерфейса + номер версии службы) однозначно идентифицирует и вызывает серверStubконкретный класс реализации.
  2. служба поддержкиApache ThriftизTransportслоистыйУправление пулом соединений,уменьшатьмежду клиентом и серверомсоединятьчастыхСоздайтеиразрушать.
  3. Поддержка сSpring Cloud ConsulизПолная интеграция, клиент проходитОбнаружение сердцебиенияиРеестр услугConsulKeep-alive, динамически синхронизированныйОбновить список услуг,мониторУслугивключить,закрытиеисостояние здоровья.
  4. служба поддержкиБалансировка клиентской нагрузки,включаютслучайный,голосованиеСтратегия балансировки нагрузки клиента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, то есть тот самыйнаименование услугимогу иметьРеализации нескольких версий.

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изИнтерфейс клиентского прокси, здесь есть две оговорки:

  • Интерфейс должен наследоваться отродительский интерфейс ThriftClientAwareThriftClientAwareвнутреннийобщий параметрЗаполните какThrift IDLСгенерированоStubсвоего родаCalculatorServiceсерединаClientвнутренний класс.
  • Интерфейс должен быть идентифицирован@ThriftClientаннотация,@ThriftClientСодержит следующие свойства:
    • serviceId: этот клиентский прокси-интерфейс привязан кThrift СерверизИдентификатор регистрации службы(с серверомбыть последовательным).
    • refer: клиентская заглушкаStubтипа вот напримерCalculatorService.class.
    • version: конкретный класс бизнес-реализацииномер версии(Если вы не заполните, по умолчанию1.0), необходимо связаться с серверомбыть последовательным.

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

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.