Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
特性
- 面向接口代理的高性能RPC调用
提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
- 智能负载均衡
内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
- 服务自动注册与发现
支持多种注册中心服务,服务实例上下线实时感知。
- 高度可扩展能力
遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
- 运行期流量调度
内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
- 可视化的服务治理与运维
提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
节点角色
角色
|
说明
|
Provider
|
暴露服务的服务提供方
|
Consumer
|
调用远程服务的服务消费方
|
Registry
|
服务注册与发现的注册中心
|
Monitor
|
统计服务的调用次数和调用时间的监控中心
|
Container
|
服务运行容器
|
再来看一张官网提供的架构图:
与Spring集成
Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于Spring 的 Schema 扩展 进行加载。只需引入Maven坐标。Dubbo里面已经包含了Spring、Zookeeper、Netty等。
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
首先,我们要定义接口和实现类,在这里我们还是搞一个操作用户信息的接口。
1、接口
package com.viewscenes.netsupervisor.service; import java.util.List; import com.viewscenes.netsupervisor.entity.InfoUser; public interface InfoUserService { void insertInfoUser(InfoUser user); InfoUser getUserById(String id); void deleteUserById(String id); List<InfoUser> getAllUser(); }
package com.viewscenes.netsupervisor.service.impl; public class InfoUserServiceImpl implements InfoUserService{ private Logger logger = LoggerFactory.getLogger(this.getClass()); private Map<String,InfoUser> userMap = new HashMap<String, InfoUser>(); public void insertInfoUser(InfoUser user) { logger.info("新增用户信息...{}",JSONObject.toJSONString(user)); userMap.put(user.getId(), user); } public List<InfoUser> getAllUser(){ List<InfoUser> infoUserList = new ArrayList<InfoUser>(); for(Map.Entry<String, InfoUser> entry:userMap.entrySet()) { infoUserList.add(entry.getValue()); } System.out.println("获取全部用户数据:"+infoUserList.size()); return infoUserList; } }
2、Provider
先来看一下生产者端的配置文件。
<?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="dubbo_producer1"/> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://192.168.139.129:2181?client=zkclient"/> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- Spring的Bean --> <bean id="infoUserService" class="com.viewscenes.netsupervisor.service.impl.InfoUserServiceImpl" /> <!-- 服务配置,暴露一个接口服务 --> <dubbo:service interface="com.viewscenes.netsupervisor.service.InfoUserService" ref="infoUserService" /> </beans>
3、Consumer
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" 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="dubbo_consumer"/> <!-- 用于配置连接注册中心相关信息 --> <dubbo:registry protocol="zookeeper" address="192.168.139.129:2181" client="zkclient" /> <!-- 引用配置 用于创建一个远程接口服务代理 --> <dubbo:reference id="infoUserService" check="false" interface="com.viewscenes.netsupervisor.service.InfoUserService"/> </beans>
4、启动
配置好之后,我们就可以在Spring项目中分别启动生产者端和消费者端。当然,先要把zookeeper服务器启动。
public class Provider1 { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo_provider1.xml"}); applicationContext.start(); System.in.read(); } }
然后,通过消费者端来创建一个用户,并不断的请求用户查询方法。
public class Consumer1 { @SuppressWarnings("resource") public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext (new String[]{"classpath:dubbo_consumer1.xml"}); context.start(); InfoUserService userService = (InfoUserService) context.getBean("infoUserService"); InfoUser infoUser = new InfoUser(); infoUser.setId(UUID.randomUUID().toString()); infoUser.setName("Jack"); infoUser.setAddress("BeiJing"); userService.insertInfoUser(infoUser); while(true) { List<InfoUser> userList = userService.getAllUser(); System.out.println("查询用户信息返回数据:"+JSONObject.toJSONString(userList)); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } }
通过上面的代码,消费者端就可以源源不断的从生产者端获取数据。