Фреймворк Ant RPC Первый опыт SOFA-RPC

задняя часть Spring открытый источник Netty

image.png

предисловие

Недавно Ant Financial открыла исходный код распределенной платформы SOFA.Арендодатель написал демонстрацию, чтобы испытать функции SOFA.SOFA полностью совместим со SpringBoot (конечно, Dubbo также совместим).

адрес проекта:Alipay , на главной странице есть 5 проектов, исходный код которых открыт для Alibaba.sofa-boot,sofa-rpc,sofa-bolt,sofa-ark,sofa-rpc-boot-projects.

быстрый старт

На самом деле, в официальной документации SOFA-RPC подробно описано, как использовать эту структуру RPC, основанную на длинном соединении Netty. Похож на Дуббо. Арендодатель смотрит на эту структуру в основном для изучения структуры распределенной среды RPC.

Поскольку для тестового примера требуется два проекта, мы создаем каталог и создаем в нем два модуля maven (достаточно проекта SpringBoot):

Один производитель, один потребитель.

Замените родительский тег springBoot в pom.xml этих двух проектов следующим:

  <parent>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofaboot-dependencies</artifactId>
    <version>2.3.1</version>
  </parent>

Добавьте еще одну зависимость:

<dependency>
  <groupId>com.alipay.sofa</groupId>
  <artifactId>rpc-sofa-boot-starter</artifactId>
</dependency>

На данный момент зависимости и конструкция RPC-фреймворка хороши, не правда ли, это очень просто?

создание интерфейса

Поскольку это служба RPC, ей нужен интерфейс и класс реализации. Создаем здесь у провайдера.

public interface HelloSyncService {
  String saySync(String string);
}

// 实现类
public class HelloSyncServiceImpl implements HelloSyncService {

  @Override
  public String saySync(String string) {
    return "provider tell you : this is your say: " +  string;
  }
}

Затем добавьте зависимость от этого интерфейса в pom.xml потребителя.

<dependency>
  <groupId>cn.think.in.java</groupId>
  <artifactId>provider</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

Когда у вас есть интерфейс, вам нужно его настроить.

Конфигурация интерфейса

Сначала опубликуйте интерфейс здесь, в файле provider. Создайте XML-файл с именем: rpc-sofa-boot-starter-samples.xml.

содержание документа:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:sofa="http://sofastack.io/schema/sofaboot"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://sofastack.io/schema/sofaboot   http://sofastack.io/schema/sofaboot.xsd"
  default-autowire="byName">

  <bean id="helloSyncServiceImpl" class="cn.think.in.java.provider.HelloSyncServiceImpl"/>
  <sofa:service ref="helloSyncServiceImpl" interface="cn.think.in.java.provider.HelloSyncService">
    <sofa:binding.bolt/>
  </sofa:service>
</beans>

Очень просто, опубликуйте интерфейс, похожий на bean-компонент Spring.

В то же время, протокол этого интерфейса — Bolt, который представляет собой сетевой коммуникационный фреймворк Ali RPC (основанный на лучших практиках Netty).

Точно так же под файлом ресурсов потребителя также создается файл с таким же именем. Содержание немного отличается.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:sofa="http://sofastack.io/schema/sofaboot"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://sofastack.io/schema/sofaboot   http://sofastack.io/schema/sofaboot.xsd"
  default-autowire="byName">

  <sofa:reference id="helloSyncServiceReference" interface="cn.think.in.java.provider.HelloSyncService">
    <sofa:binding.bolt/>
  </sofa:reference>
</beans>

Получить bean-компонент через интерфейс.

Ок, интерфейс настроен, можно приступать к тесту.

Подготовьтесь к тесту

Перед тестированием еще нужно немного поработать.

В файле конфигурации провайдера appcation.perproties настройте порт и имя программы.

# server.port=8080 # 默认
spring.application.name=provider

Порт по умолчанию — 8080, поэтому настраивать его не нужно.

Затем настройте этот файл и в потребителе. Содержание следующее:

spring.application.name=consumer
server.port=8081

Порты потребителя и провайдера не могут конфликтовать.

Остался последний шаг.

Импортируйте файл в контейнер Spring.

Добавьте следующее в класс запуска провайдера (представьте файл конфигурации):

@ImportResource({ "classpath*:rpc-sofa-boot-starter-samples.xml" })
@SpringBootApplication
public class ProviderApplication {

  public static void main(String[] args) {
    SpringApplication.run(ProviderApplication.class, args);
  }
}

Введите следующее в потребительский стартовый класс:

@ImportResource({ "classpath*:rpc-sofa-boot-starter-samples.xml" })
@SpringBootApplication
public class ConsumerApplication {

  public static void main(String[] args) {
    SpringApplication springApplication = new SpringApplication(ConsumerApplication.class);
    ApplicationContext applicationContext = springApplication.run(args);

    HelloSyncService helloSyncServiceReference = (HelloSyncService) applicationContext
        .getBean("helloSyncServiceReference");

    System.out.println(helloSyncServiceReference.saySync("sync"));
  }
}

Немного больше вещей, но все еще довольно просто.

Сначала создайте загрузочный класс Spring. Затем запустите, получите bean-компонент (удаленный вызов, инкапсулированный динамическим прокси) из контейнера Spirng. Затем вызовите метод делегата.

бегать

Сначала запустите провайдер:

2018-04-23 23:18:24.776  INFO 26654 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)
2018-04-23 23:18:24.776  INFO 26654 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env || /env.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-04-23 23:18:24.886  INFO 26654 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-04-23 23:18:24.893  INFO 26654 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
Sofa-Middleware-Log SLF4J : Actual binding is of type [ com.alipay.remoting Logback ]
2018-04-23 23:18:24.966  INFO 26654 --- [           main] com.alipay.sofa.common.log               : Sofa-Middleware-Log SLF4J : Actual binding is of type [ com.alipay.remoting Logback ]
2018-04-23 23:18:25.174  INFO 26654 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-04-23 23:18:25.179  INFO 26654 --- [           main] c.t.i.java.provider.ProviderApplication  : Started ProviderApplication in 3.352 seconds (JVM running for 3.978)

Запустите потребителя снова:

2018-04-23 23:19:21.940  INFO 26673 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env || /env.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-04-23 23:19:22.055  INFO 26673 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-04-23 23:19:22.063  INFO 26673 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2018-04-23 23:19:22.319  INFO 26673 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2018-04-23 23:19:22.324  INFO 26673 --- [           main] c.t.i.java.consumer.ConsumerApplication  : Started ConsumerApplication in 3.898 seconds (JVM running for 4.524)
provider tell you : this is your say: sync

Результат печатается успешно.

Суммировать

Во-первых, первое впечатление, что этот фреймворк по-прежнему очень удобен в использовании, достаточно простой, основанный на текущем SpringBoot. Быстрый старт. И это не Http-вызов SpringCloud, использующий Netty в качестве сетевой среды связи, конечно, с производительностью проблем нет.

Конечно, реестр, используемый нашей демонстрацией здесь, не использует ZK, ведь первый опыт — это использование локальных файлов.

Тем не менее, арендодатель очень заинтересован в этой структуре. В следующее свободное время домовладелец изучит кодекс, связанный с SOFA.