微服务(SOA)
一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
实现方式
1、基于HTTP协议的同步机制(REST、RPC);
2、基于消息队列的异步消息处理机制(AMQP-based message broker)。
实践
今天我将采用效率最高的模式RPC协议展开研究,在SOA服务治理方面,阿里巴巴的Dubbo可以提供高性能和透明化的RPC远程服务调用方案。
我们需要安装zookeeper 3.4.13版本。
http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
采用API方式进行调用
首先创建两个maven项目,分别在pom.xml中引入以下jar包。
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
Provider实现
//1.服务实现
EchoService echoService = new EchoServiceImpl();//输出服务
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("projectTest");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://localhost:2181");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(28080);
protocol.setThreads(200);
// 服务提供者暴露服务配置
ServiceConfig<EchoService> service = new ServiceConfig<EchoService>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
service.setInterface(EchoService.class);
service.setRef(echoService);
service.setVersion("1.0.0");
System.out.println("dubbo服务已暴露");
service.export();
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
Consumer实现
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("projectTest2");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://localhost:2181");
// 引用远程服务
ReferenceConfig<EchoService> reference = new ReferenceConfig<EchoService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
reference.setApplication(application);
reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
reference.setInterface(EchoService.class);
reference.setVersion("1.0.0");
EchoService echoService = reference.get();
System.out.println(echoService.echo());
采用XML配置
provider.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:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="providerTest1" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.hengyi.service.EchoService" ref="echoService" />
<!-- 和本地bean一样实现服务 -->
<bean id="echoService" class="com.hengyi.service.impl.EchoServiceImpl" />
</beans>
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.out.println("dubbo暴露");
try {
System.in.read(); // 按任意键退出
} catch (IOException e) {
e.printStackTrace();
}
consumer.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:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="projectTest2" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用echoService -->
<dubbo:reference id="echoService" interface="com.hengyi.service.EchoService" />
</beans>
//@reference
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
EchoService demoService = (EchoService)context.getBean("echoService"); // 获取远程服务代理
String echo = demoService.echo();
System.out.println( echo ); // 显示调用结果