Spring Cloud OpenFeign интегрирует протокольный буфер

задняя часть Микросервисы Архитектура Spring

Автор этой статьи, Чжан Тянь, является автором книги 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-…

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.Контракт…