Автор этой статьи, Чжан Тянь, является автором книги Spring Cloud Microservice Architecture Advanced.
задний план
В предыдущих статьях мы представили микросервисную архитектуру Spring Cloud, в которой взаимодействие между экземплярами микросервиса обычно представляет собой HTTP-запросы RESTful или вызовы RPC. Spring Cloud предоставил разработчикам компоненты OpenFeign, предназначенные для обработки HTTP-запросов RESTful, но нет соответствующего компонента вызова RPC. Сегодня мы собираемся настроить кодек OpenFeign и использовать кодировку буфера протокола Google, чтобы она имела преимущества высокой эффективности передачи данных и преобразования для вызовов RPC.
OpenFeign — это декларативный клиент HTTP-запросов RESTful, который упрощает и ускоряет написание клиентов веб-сервисов. Он имеет широкие возможности настройки и может настраивать все его аспекты в соответствии со своими потребностями, такие как кодеки, анализ маршрутизации услуг и балансировка нагрузки.
Protocol Buffer — это легкий и эффективный формат хранения структурированных данных от Google, который можно использовать для сериализации или сериализации структурированных данных. Это хорошее хранилище данных или формат обмена данными RPC. Независимый от языка, платформы и расширяемый сериализованный формат структурированных данных, который можно использовать в протоколах связи, хранении данных и других областях. В настоящее время предоставляются API на C++, Java и Python.
OpenFeign использует по умолчаниюHttpUrlConnection
Передача сетевого запроса; код реализации, относящийся кDefaultFeignLoadBalancedConfiguration
изClient.Default
. Используемый кодек по умолчанию — jackson2, а конфигурация по умолчанию —HttpMessageConvertersAutoConfiguration
.
Эффективность кодирования и декодирования Protocol Buffer намного выше, чем у jackson 2. В сценарии, где экземпляры микрослужб часто обмениваются данными, использование Protocol Buffer для кодирования и декодирования будет занимать меньше системных ресурсов и будет более эффективным. Дополнительные сведения см. в этом документе, в котором сравнивается производительность различных платформ сериализации и десериализации.GitHub.com/Ehhanye/JVM-…
Буфер протокола интеграции клиента
Разработчики могут использовать настраиваемые классы конфигурации для настройки OpenFeign для предоставления экземпляров компонентов кодека, требуемых OpenFeign, тем самым заменяя экземпляры компонентов по умолчанию для выполнения настройки. Пользовательский класс конфигурации показан ниже.
@Configuration
public class ProtoFeignConfiguration {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverterObjectFactory;
@Bean
public ProtobufHttpMessageConverter protobufHttpMessageConverter() {
return new ProtobufHttpMessageConverter();
}
@Bean
public Encoder springEncoder() {
return new SpringEncoder(this.messageConverterObjectFactory);
}
@Bean
public Decoder springDecoder() {
return new ResponseEntityDecoder(new SpringDecoder(this.messageConverterObjectFactory));
}
}
вProtobufHttpMessageConverter
даHttpMessageConverters
Класс реализации Protobuf отвечает за кодирование и декодирование сетевых запросов и ответов с использованием буфера протокола. а такжеSpringEncoder
а такжеResponseEntityDecoder
Класс реализации кодека в OpenFeign.
Далее рассмотрим определение интерфейса для отправки сетевых запросов в OpenFeign.@FeignClient
настроен вProtoFeignConfiguration
Класс для пользовательской конфигурации.
@FeignClient(name = "user", configuration = ProtoFeignConfiguration.class)
public interface UserClient {
@RequestMapping(value = "/info", method = RequestMethod.GET,
consumes = "application/x-protobuf", produces = "application/x-protobuf")
UserDTO getUserInfo(@RequestParam("id") Long id);
}
в,UserDTO
Он автоматически генерируется с помощью подключаемого модуля maven для Protocol Buffer. Следует отметить, что@RequestMapping
изconsumes
а такжеproduces
свойство установлено наapplication/x-protobuf
, указывающее, что формат кодирования сетевых запросов и ответов должен быть Protobuf, иначе может быть получен код ответа об ошибке 406.
Ниже приведено определение формата данных в прото-файле, где java_package — это целевая папка, указывающая на сгенерированный файл. В этом файле определяется формат данных UserDTO, который включает три атрибута: идентификатор, имя и URL-адрес домашней страницы.
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.remcarpediem.feignprotobuf.proto.dto";
package com.remcarpediem.feignprotobuf.proto.dto;
message UserDTO {
int32 id = 1;
string name = 2;
string url = 3;
}
Настройте свойство сборки в файле pom и используйте подключаемый модуль Maven для Protocol Buffer для автоматического создания кода Java на основе файла proto. Каждый элемент конфигурации имеет соответствующее объяснение в коде.
<build>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<extensions>true</extensions>
<configuration>
<!--默认值-->
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
<!--默认值-->
<!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->
<outputDirectory>${project.build.sourceDirectory}</outputDirectory>
<!--设置是否在生成java文件之前清空outputDirectory的文件,默认值为true,设置为false时也会覆盖同名文件-->
<clearOutputDirectory>false</clearOutputDirectory>
<!--默认值-->
<temporaryProtoFileDirectory>${project.build.directory}/protoc-dependencies</temporaryProtoFileDirectory>
<!--更多配置信息可以查看https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html-->
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<!--也可以设置成局部变量,执行compile或test-compile时才执行-->
<!--<configuration>-->
<!--<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>-->
<!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->
<!--<temporaryProtoFileDirectory>${project.build.directory}/protoc-dependencies</temporaryProtoFileDirectory>-->
<!--</configuration>-->
</execution>
</executions>
</plugin>
</plugins>
</build>
Затем запустите подключаемый модуль Maven для Protocol Buffer, чтобы автоматически сгенерировать связанные классы данных.
Сервер
Затем следует интеграция Protocol Buffer на стороне сервера. Нам также нужно использовать пользовательский класс конфигурации дляProtobufHttpMessageConverter
Установите в качестве системного кодека по умолчанию, как показано в следующем коде.
@Configuration
public class Conf {
@Bean
ProtobufHttpMessageConverter protobufHttpMessageConverter() {
return new ProtobufHttpMessageConverter();
}
}
Затем определите информационный интерфейс о пользователе контроллера. Возвращает экземпляр UserDTO в качестве возвращаемого значения сетевого запроса.ProtobufHttpMessageConverter
Он будет автоматически преобразован в формат данных транспортного буфера протокола.
@RestController
public class UserController {
private String host = "http://blog.com/user/";
@GetMapping("/info")
public UserDTO getUserInfo(@RequestParam("id") Long id) {
return UserDTO.newBuilder().
setId(id).setName("Tom").
setUrl(host + "Tom").build();
}
}
Адрес источника этой статьи: GitHub:GitHub.com/Трумэн/Летучий голубь…
Суммировать
Для получения более подробных принципов и деталей реализации вы можете обратить внимание на «Расширенную архитектуру Spring Cloud Microservice», опубликованную автором.В этой книге объясняются принцип и практическое применение каждого основного компонента версии Spring Cloud Finchley.RELEASE. , Подробный разбор принципа и реализации OpenFeign. Для более подробного ознакомления см.Усовершенствованная облачная микросервисная архитектура Spring.
Адрес покупки Spring Cloud Microservice Architecture Advanced:item.JD.com/12453340.Контракт…