文章目录
- 什么是dubbo
- dubbo架构
- dubbo的使用
- dubbo-admin
- 安装dubbo-admin
- dubbo-admin的使用
- 服务查询
- 序列化
- 地址缓存
- 版本控制
- 负载均衡
- 集群容错
- 服务降级
什么是dubbo
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。
dubbo架构
0.start:服务的提供者运行在类似于tomcat等容器中
1.regisiter:将启动的服务注册到注册中心,dubbo官方有推荐zookeeper作为注册中心
2.subscribe:消费者在注册中心发现提供的服务
3.notify:通知得到服务的路径
4.invoke:RPC,即远程调用服务
5.count:服务监控
dubbo的使用
要使用dubbo我们首先要有一个注册中心,我在这里使用的zookeeper作为注册中心,具体安装步骤以及zookeeper操作可以看我这篇博客。
打开安装好的zookeeper。
之后我们可以新建一个spring项目,导入一下spring要的maven坐标以及spring的xml配置文件。
之后当然也要导入dubbo和zookeeper的maven坐标
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<dubbo.version>2.7.4.1</dubbo.version>
<zookeeper.version>4.0.0</zookeeper.version>
</properties>
<!-- servlet3.0规范的坐标 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
当然之后我们还需到spring的xml配置文件中加入dubbo的配置
<!--配置项目名称-->
<dubbo:application name="dubbo-web">
<dubbo:parameter key="qos.port" value="33333"/>
</dubbo:application>
<!--配置注册中心地址-->
<dubbo:registry address="zookeeper://192.168.88.130:2181"/>
<!--配置dubbo包扫描-->
<dubbo:annotation package="com.cjh.controller"/>
之后我们可以先写一个标准的springMVC
这里是controller
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
@RequestMapping("/find")
public User find(int id){
return userService.findUserById(id);
}
}
而将这个controller使用dubbo非常的简单,只需要将@Autowired注解改成dubbo的@Reference注解。
而我们的serviceImpl也很简单
//@Service 将该类的对象创建出来,放到spring的IOC容器中 bean定义
@Service //将该类提供的服务对外发布,将访问的地址 ip 端口 路径注册到注册中心
public class UserServiceImpl implements UserService {
@Override
public String sayHello() {
return "hello dubbo";
}
@Override
public User findUserById(int id) {
User user=new User(1,"张三","123456");
return user;
}
}
要注意的是这里虽然还是@Service注解,但是作用和spring的@Service还是有区别的
其他地方和我们的正常springMVC没有区别。
dubbo-admin
dubbo-admin是一个图形化界面,用于管理dubbo提供的服务
从注册中心获取所有的提供者、消费者进行配置管理
提供路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡等管理功能
安装dubbo-admin
dubbo-admin是一个前端VUE后端springboot的软件,所以我们需要先安装一个node.js,用于启动前端的VUE服务
node安装地址
之后下载我们的安装包,下载地址
进去记得选一下分支的版本,我这里用的是一个develop版本
选择clone还是直接下载,都可以
下载玩安装包后,我们进入到dubbo-admin-develop\dubbo-admin-server\src\main\resources下的一个application.properties文件,进入之后我们修改一下zookeeper的ip地址
# centers in dubbo2.7
admin.registry.address=zookeeper://192.168.149.135:2181
admin.config-center=zookeeper://192.168.149.135:2181
admin.metadata-report.address=zookeeper://192.168.149.135:2181
在之后的步骤中我们要一直
在之后,我们回到根目录,进入到powershell或cmd中,执行我们mave的打包命令
mvn clean package
这里我们要注意的是一定要用JDK8,我之前就应为JDK的版本不对,导致半天没有安装成功
当我们完成打包后,我们就可以去执行我们的后端程序了
我们进入到server中的target目录下,运行jar包
当我们在最后看到了端口号,就意味着我们后端已经启动了
之后进入到dubbo-admin-develop\dubbo-admin-ui目录中
执行一下命令,启动我们的前端
npm run dev
之后我们的cmd界面就会出现一个网址
进入这个网址,就是我们的图形化界面
当然要注意的是,我的zookeeper是在Linux虚拟机中,所以不会有端口占用的问题,如果你的zookeeper在本地,就需要进入到最开始的properties文件中改一下默认的端口号
dubbo-admin的使用
我们启用一个我们的一个dubbo程序,来看看dubbo的一些功能
服务查询
在这里可以看到我们服务的一个状态
当然如果你第一次进去,会发现地下的元数据是不可用的,这里就需要我们进入到一个service中的spring的xml配置文件中给元数据服务一个注册中心
<!-- 元数据配置 -->
<dubbo:metadata-report address="zookeeper://192.168.149.135:2181" />
序列化
dubbo内部为我们内置序列化和反序列化,所以我们只需要将我们的实体类继承一下Serializable接口
地址缓存
就是当我们的注册中心挂了,我们通过缓存的服务地址,依旧可以访问服务,不影响我服务的正常使用
版本控制
我们可以在服务提供方的@Service注解后面增加一个version属性,所以我们就可以用多个不同的service服务,然后我们就能通过在controller中的@Reference注解的后面也加上version属性,自己选择服务的版本,如果要更改版本只需要我们的客户端重启一下就可以。这种更新方式我们叫做灰度更新。
负载均衡
负载均衡是针对我们的服务器集群使用的,为了防止我们的某台服务器一直满负荷工作,而其他服务器却在看戏的情况。
通过在服务的提供方的@Service注解后面增加一个weight属性,以此为我们的不同服务直接提供不同的权重。
然后我们在消费者的@Reference注解后面增加一个loadbalance属性,用于指定我们的负载均衡的策略。
dubbo为我们提供了四种负载均衡的策略
Random:按权重随机。即按权重设置概率
RoundRobin:按权重轮询。即按权重设置一个循环中按权重设置次数
LeastActice:最少活跃调用次数,相同活跃数的随机
ConsistentHash:一致性Hash,相同参数的请求总是发到同一提供者。
集群容错
即我们的集群服务中有一台或几台挂了,不会影响我们提供服务
服务降级
当我们的流量比较高的时候,我们的服务器的压力比较大,为了减轻我们服务器的压力我们可以选择一些不重要的服务直接不提供,例如一些广告服务。
我们可以通过在消费者的@Reference注解后面添加一个mock=force:return false,表示直接不调用该服务