Dubbo

  • Dubbo框架介绍
  • dubbo入门案例
  • dubbo负载均衡的实现
  • 补充


Dubbo框架介绍

http://dubbo.apache.org/zh-cn/ Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
dubbo实现远程调用的原理 dubbo怎么实现远程调用_负载均衡

初级的微服务项目有3大部分:
1.consumer
2.provider
3.中立API接口
provider依赖中立API接口

dubbo入门案例

dubbo入门案例 资料提取码:2yvy

  1. 构建项目
    下载并导入dubbo入门案例
  2. 在父项目导入dubbo的jar包文件
<!--引入dubbo配置 -->
      <dependency>
         <groupId>com.alibaba.boot</groupId>
         <artifactId>dubbo-spring-boot-starter</artifactId>
         <version>0.2.0</version>
      </dependency>
  1. provider都依赖于中立API接口,在provider 里都添加中立API接口的依赖
<dependencies>
  <dependency>
      <groupId>com.jt.dubbo</groupId>
      <artifactId>dubbo-jt-demo-interface</artifactId>
      <version>0.0.1-SNAPSHOT</version>
  </dependency>
 </dependencies>
  1. 编辑provider项目的后台调用的方法
//这个Service注解是dubbo的,而这个UserService接口是另一个中立API接口项目的
//dubbo的@Service注解表示这个服是务提供者的

@Service(timeout=3000)	//3秒超时  dubbo内部封装了RPC 
public class UserServiceImpl implements UserService {
	
	@Autowired
	private UserMapper userMapper;
	
	//查询所有数据
	@Override
	public List<User> findAll() {
		
		System.out.println("我是第一个服务的提供者");
		return userMapper.selectList(null);
	}
	
	@Override
	public void saveUser(User user) {
		
		userMapper.insert(user);
	}

}
  1. 编辑provider项目的配置文件
server:
  port: 9000

spring:
  datasource:
    #引入druid数据源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

#springBoot导入dubboo   
dubbo:
  scan:      #让dubbo注解起作用  @Service
    basePackages: com.jt
  application:
    name: provider-user   #定义提供者的名称    不同的服务名称不同
  registry:				#zk的ip地址要换成自己的
    address: zookeeper://192.168.64.128:2181?backup=192.168.64.128:2182,192.168.64.128:2183
  protocol:    #rpc  指定协议规则
    name: dubbo    #引入dubbo协议,dubbo内部默认实现
    port: 20880    #每一个服务都应该有个各自对应的端口
        
mybatis-plus:
  type-aliases-package: com.jt.dubbo.pojo       #配置别名包路径
  mapper-locations: classpath:/mybatis/mappers/*.xml  #添加mapper映射文件
  configuration:
    map-underscore-to-camel-case: true                #开启驼峰映射规则
  1. 配置costumer项目
    消费者作用:
    消费者目的通过接口动态的获取服务端的数据。消费者利用RPC(具体协议http/dubbo……)获取服务端数据。

1.costumer项目不用连接数据库,需要的东西调用provider项目的服务获取返回的数据即可

//给costumer项目的启动类加上以下注解
//排除数据源启动
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
public class SpringBoot_Run {
	
	public static void main(String[] args) {
		
		SpringApplication.run(SpringBoot_Run.class, args);
	}
}

2.编辑costumer的controller

@RestController
public class UserController {
	
	/**
	 * timeout:定义连接超时时间
	 * check:消费者启动时检查是否有服务的提供者
	 * 
	 * 调整负载均衡策略:loadbalance
	 * 		1.随机策略	random
	 * 		2.轮询策略	roundrobin
	 * 		3.IPHash策略 consistenthash
	 * 		4.最小访问策略 leastactive
	 * 		
	 */
	 //dubbo的@Reference标识这个是服务消费者的
	@Reference(timeout=3000,check=true,loadbalance = "leastactive")
	private UserService userService;
	
	@RequestMapping("/findAll")
	public List<User> findAll(){
		//调用远程服务器中数据 rpc
		return userService.findAll();
	}
	
	//测试新增操作   如果名称与对象中的属性一致,则可以使用对象直接接收 
	@RequestMapping("/saveUser/{name}/{age}/{sex}")
	public String saveUser(User user) {
		
		userService.saveUser(user);
		return "用户入库成功!!!";
	}
}

3.配置costumer项目的配置文件

server:
  port: 9001
dubbo:
  scan:
    basePackages: com.jt  #指定包路径
  application:
    name: consumer-user   #业务标识   
  registry:			#zk的ip地址要换成自己的
    address: zookeeper://192.168.64.128:2181?backup=192.168.64.128:2182,192.168.64.128:2183

dubbo负载均衡的实现

如果采用集中式的负载均衡(Nginx),则负载均衡服务器的处理能力将制约整个服务器的性能。

dubbo实现远程调用的原理 dubbo怎么实现远程调用_java_02


在微服务中,一般采用客户端负载均衡服务器,有效地提高服务器效率。

dubbo实现远程调用的原理 dubbo怎么实现远程调用_java_03


调整负载均衡策略:loadbalance

实现:(在costumer服务里的@Reference注解注入对象时加入以下属性即可完成不同的负载均衡策略)

  1. 随机策略:当dubbo有多个服务的消费者时,默认条件下采用随机策略。(random)
@Reference(timeout=3000,check=true,loadbalance="random")
   private UserService userService;
  1. 轮询策略:每个服务器依次访问。(roundrobin)
@Reference(timeout=3000,check=true,loadbalance="roundrobin")
   private UserService userService;
  1. IPHash策略:发起的访问通过ip hash计算到一个特定的服务器,就只访问这个服务器。(consistenthash)
//类名: ConsistentHashLoadBalance
//配置名称: consistenthash
@Reference(timeout=3000,check=true,loadbalance="consistenthash")
   private UserService userService;
  1. 最小访问策略:发起的请求访问访问数量最小的一个服务器。(leastactive)
@Reference(timeout=3000,check=true,loadbalance="leastactive")
   private UserService userService;

补充

提供者宕机不会影响消费者的使用。因为zk的心跳机制:当提供者重启时,zk有自动发现功能。当服务器重启时,会动态的维护服务列表数据。
zk集群宕机,用户依然可以访问提供者, 由于dubbo启动时,会链接注册中心,将服务列表数据保存到本地(消费者内存中);当用户下次访问时,根据内存中的数据进行负载均衡;如果这时提供者宕机,那么消费者在尝试链接后发现服务宕机,则会动态的修改本地的服务列表信息标识为down。