предисловие
Недавно 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.