Dubbo框架介绍
http://dubbo.apache.org/zh-cn/
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
初级的微服务项目有3大部分:
1.consumer
2.provider
3.中立API接口
provider依赖中立API接口
dubbo入门案例
dubbo入门案例 资料提取码:2yvy
- 构建项目
下载并导入dubbo入门案例
- 在父项目导入dubbo的jar包文件
<!--引入dubbo配置 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
- 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>
- 编辑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);
}
}
- 编辑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 #开启驼峰映射规则
- 配置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),则负载均衡服务器的处理能力将制约整个服务器的性能。
在微服务中,一般采用客户端负载均衡服务器,有效地提高服务器效率。
调整负载均衡策略:loadbalance
实现:(在costumer服务里的@Reference注解注入对象时加入以下属性即可完成不同的负载均衡策略)
- 随机策略:当dubbo有多个服务的消费者时,默认条件下采用随机策略。(random)
@Reference(timeout=3000,check=true,loadbalance="random")
private UserService userService;
- 轮询策略:每个服务器依次访问。(roundrobin)
@Reference(timeout=3000,check=true,loadbalance="roundrobin")
private UserService userService;
- IPHash策略:发起的访问通过ip hash计算到一个特定的服务器,就只访问这个服务器。(consistenthash)
//类名: ConsistentHashLoadBalance
//配置名称: consistenthash
@Reference(timeout=3000,check=true,loadbalance="consistenthash")
private UserService userService;
- 最小访问策略:发起的请求访问访问数量最小的一个服务器。(leastactive)
@Reference(timeout=3000,check=true,loadbalance="leastactive")
private UserService userService;
补充
提供者宕机不会影响消费者的使用。因为zk的心跳机制:当提供者重启时,zk有自动发现功能。当服务器重启时,会动态的维护服务列表数据。
zk集群宕机,用户依然可以访问提供者, 由于dubbo启动时,会链接注册中心,将服务列表数据保存到本地(消费者内存中);当用户下次访问时,根据内存中的数据进行负载均衡;如果这时提供者宕机,那么消费者在尝试链接后发现服务宕机,则会动态的修改本地的服务列表信息标识为down。