Spring、Spring Boot集成分布式服务框架Dubbo
一、Dobbo概述
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC(远程服务调用框架) 实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbox是当当网的扩展版本,Dubbox 和Dubbo本质上没有区别,名字的含义扩展了Dubbo。 后来捐献给Apache基金会孵化,现已正式成为Apache顶级项目。
Apache Dubbo提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
核心部分
1.远程通讯,提供对多种基于长连接的NiO框架抽象封装,包括多种线程模型,序列化,以及“请求一响应”模式的信息交换方式。
2.集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持。以及负载均衡,失败容错,地址路由,动态配置等集群支持。
3.自动发现:基于注册中心目录服务,使用服务消费能动态查找服务提供方,使地址透明,使用服务提供方可以平滑增加或减少服务器
Dubbo架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
Subscribe:订阅
Notify:通知
Invoke:调用
调用关系说明:
1. 服务容器负责启动,加载,运行服务提供者。
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
二、注册中心之Zookeeper
zookeeper概述
官方推荐使用zookeeper注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境。
zooKeeper用来做dubbo的注册中心,即哪一个服务由哪一台机器来提供必需让调用者知道,简单来说就是 ip 地址和服务名称的对应关系。
zookeeper安装
1.Docker安装zookeeper
2.源码安装zookeeper
1.下载zookeeper
zookeeper官网:https://zookeeper.apache.org/
ZooKeeper服务器是用Java创建的,运行在JVM之上,所以需要安装JDK 。
2.上传 apache-zookeeper-3.6.3-bin.tar.gz
3.解压
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
4.配置
进入到conf目录拷贝一个zoo_sample.cfg并完成配置
#进入到conf目录
cd /zooKeeper/apache-zookeeper-3.6.3-bin/conf/
#拷贝
cp zoo_sample.cfg zoo.cfg
# 修改zoo.cfg
vim /zooKeeper/apache-zookeeper-3.6.3-bin/conf/zoo.cfg
修改存储目录:dataDir=/zookeeper/zkdata
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/zookeeper/zkdata
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
5.启动
cd /zooKeeper/apache-zookeeper-3.6.3-bin/bin/
#启动
./zkServer.sh start
6.查看状态
./zkServer.sh status
ZooKeeper客户端工具
1.Zoolnspector
2.PrettyZoo
PrettyZoo: https://github.com/vran-dev/PrettyZoo
三、Spring集成Dubbo
1.创建公共接口模块
创建dubbo-interface公共接口模块,并添加一个接口。
public interface IDemoTestService {
public String demoTest();
}
2.服务提供者
创建dubbo-service工程模块,打包方式是war包。
pom.xml中引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ybzy</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>5.2.8.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相关,版本2.7之后统一为org.apache.dubb-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.9</version>
</dependency>
<!--ZooKeeper相关 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<!--dubbo使用相关 -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.9.0.GA</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<!--公共接口模块-->
<dependency>
<groupId>cn.ybzy</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8081</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
创建接口实现类
对公共接口模块中的接口进行实现
注意:Service注解是com.alibaba包下的
import cn.ybzy.demo.service.IDemoTestService;
import com.alibaba.dubbo.config.annotation.Service;
/**
* @Service作用:
*
* 1.这该类提供的方法(服务)对外发布
*
* 2.将访问的地址 ip,端口,路径注册到注册中心中
*/
@Service
public class DemoTestServiceImpl implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
配置applicationContext.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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--配置dubbo应用的名称,唯一-->
<dubbo:application name="dubbo-service"/>
<!--配置注册中心的地址-->
<dubbo:registry address="zookeeper://ip:2181"/>
<!--配置dubbo包扫描,dubbo:annotation用于扫描@Service注解-->
<dubbo:annotation package="cn.ybzy.demo.service" />
</beans>
3.服务消费者
创建Maven工程,dubbo-web,打包方式为War包。
同dubbo-service工程,引入依赖,修改tomcat插件访问端口。
配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 解决中文乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
创建控制器
注意:Reference注解是com.alibaba包下的
@RestController
@RequestMapping("/demo")
public class DemoTestController {
/**
* 1. 从zookeeper注册中心获取demoTestService的访问url
* 2. 进行远程调用RPC
* 3. 将结果封装为一个代理对象。给变量赋值
*/
@Reference
private IDemoTestService demoTestService;
@RequestMapping("/test")
public String demoTest(){
return demoTestService.demoTest();
}
}
配置spring-mvc.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://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.ybzy.demo.controller"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<dubbo:application name="dubbo-web"/>
<dubbo:registry address="zookeeper://ip:2181"/>
<dubbo:annotation package="cn.ybzy.dmeo.controller" />
</beans>
4.执行测试
tomcat7:run 分别运行两个项目,浏览器访问http://localhost:8082/demo/test
5.查看zookeeper
四、部署管理中心
dubbo-admin是一个Dubbo的管理平台,是图形化的服务管理页面,它从注册中心中获取到所有的提供者 / 消费者进行配置管理,如:路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
Docker安装dubbo-admin
源码安装dubbo-admin
1.下载Dubbo-Admin
https://github.com/apache/dubbo-admin.git
2.解压及修改配置文件
进入dubbo-admin-server\src\main\resources目录,修改 **application.properties** 配置文件
修改zookeeper地址
# centers in dubbo2.7, if you want to add parameters, please add them to the url
admin.registry.address=zookeeper://127.0.0.1:2181
admin.config-center=zookeeper://127.0.0.1:2181
admin.metadata-report.address=zookeeper://127.0.0.1:2181
admin.registry.address 注册中心
admin.config-center 配置中心
admin.metadata-report.address 元数据中心
3.打包项目
在dubbo-admin-develop目录执行打包命令 :mvn clean package
4.启动后端项目
进入dubbo-Admin-develop\dubbo-admin-distribution\target>目录
启动 dubbo-admi : java -jar .\dubbo-admin-0.1.jar
5.安装node.js
下载 :https://nodejs.org/en/
6.启动前端项目
dubbo-admin-ui 目录下执行命令:
npm run dev
7.浏览器访问
默认用户名密码都是root
admin.root.user.name=root
admin.root.user.password=root
五、Spring Boot集成Dubbo
构建父模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ybzy</groupId>
<artifactId>dubbo</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.8.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.10</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.10</version>
<type>pom</type>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
</project>
Common-api
统一定义接口,供其其他模块引用
public interface HelloService {
String sayHello(String message);
}
服务提供者
服务提供者,实现common-api模块中的接口,然后暴露到Zookeeper中,供服务消费者使用
在Spring Boot启动类中加入@EnableDubbo注解,表示要开启dubbo功能
@EnableDubbo能够找到Dubbo注解所注解的任何内容。
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ProviderApplicaiton {
public static void main(String[] args) {
SpringApplication.run(ProviderApplicaiton.class, args);
}
}
提供者配置
server:
port: 8080
dubbo:
application:
# 服务名称,保持唯一
name: server-provider
# zookeeper地址,用于向其注册服务
registry:
address: zookeeper://127.0.0.1:2181
#暴露服务方式
protocol:
# dubbo协议,固定写法
name: dubbo
# 暴露服务端口 (默认是20880,不同的服务提供者端口不能重复)
port: 20880
接口实现类必须注解@DubboService
import cn.ybzy.common.api.HelloService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;
@DubboService
@Component
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String message) {
return "hello," + message;
}
}
服务消费者
服务消费者,通过Dubbo从Zookeeper中获取服务并消费
在Spring Boot启动类中加入@EnableDubbo注解,表示要开启dubbo功能
@EnableDubbo能够找到Dubbo注解所注解的任何内容
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ConsumerApplicaiton {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplicaiton.class, args);
}
}
消费者配置
server:
port: 8081
dubbo:
application:
# 服务名称,保持唯一
name: server-consumer
# zookeeper地址,用于从中获取注册的服务
registry:
address: zookeeper://127.0.0.1:2181
protocol:
# dubbo协议,固定写法
name: dubbo
使用@DubboReference注解将提供者自动装配到消费者中
@RestController
public class HelloController {
@DubboReference
private HelloService helloService;
@GetMapping("/hello/{message}")
public String sayHello(@PathVariable String message) {
return this.helloService.sayHello(message);
}
}
执行测试
启动服务,访问http://localhost:8081/hello/dubbo
通过客户端连接zookeeper
六、Dubbo的特性
地址缓存
当zookeeper注册中心挂了,服务任然可以正常访问,原因如下:
1.dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后调用不会访问注册中心。
2.当服务提供者地址发生变化时,注册中心会通知服务消费者。
超时机制
服务消费者在调用服务提供者的时候如果发生了阻塞、等待的情况,会造成服务消费者一直等待下去。如果在某个峰值时刻,大量请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
dubbo利用超时机制来解决该问题:设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
使用timeout属性配置超时时间,默认值1000,单位毫秒。
@Service(timeout = 3000)
public class DemoTestServiceImpl implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
重试机制
Dubbo服务在尝试调用一次之后,如出现非业务异常(服务突然不可用、超时等),Dubbo 默认会进行额外的最多2次重试
通过 retries 属性设置重试次数。默认为 2 次。
@Service(retries = 3)
public class DemoTestServiceImpl implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
各节点关系:
这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息
Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更
Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个
Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等
LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选
集群容错模式:
Failover Cluster:
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
Failfast Cluster :
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster :
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster :
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster :
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
Broadcast Cluster :
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
@RestController
@RequestMapping("/demo")
public class DemoTestController {
@Reference(cluster = "failover")
private IDemoTestService demoTestService;
@RequestMapping("/test")
public String demoTest(){
return demoTestService.demoTest();
}
}
负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
Dubbo提供了4种负载均衡策略:Random 、RoundRobin 、LeastActive、ConsistentHash
Random :
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
@Service(weight = 100)
public class DemoTestServiceImpl2 implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
RoundRobin :
轮询,按公约后的权重设置轮询比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
@Service(weight = 100,loadbalance="roundrobin")
public class DemoTestServiceImpl2 implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
LeastActive:
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
@Service(weight = 100,loadbalance="leastactive")
public class DemoTestServiceImpl2 implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
ConsistentHash:
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />
@Service(weight = 100,loadbalance="consistenthash")
public class DemoTestServiceImpl2 implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
多版本
在 Dubbo 中为同一个服务配置多个版本。当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
版本迁移步骤:
1.在低压力时间段,先升级一半提供者为新版本
2.再将所有消费者升级为新版本
3.然后将剩下的一半提供者升级为新版本
dubbo中使用version属性来设置和调用同一个接口的不同版本。
创建如下2个服务提供者:
@Service(version = "v0.0.1")
public class DemoTestServiceImpl implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
@Service(version = "v0.0.2")
public class DemoTestServiceImpl2 implements IDemoTestService {
@Override
public String demoTest() {
return "Hello Dubbo!";
}
}
服务消费者
@RestController
@RequestMapping("/demo")
public class DemoTestController {
@Reference(version = "v0.0.2")
private IDemoTestService demoTestService;
@RequestMapping("/test")
public String demoTest(){
return demoTestService.demoTest();
}
}
服务降级
可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
mock=force:return null
表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
mock=fail:return null
表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
@RestController
@RequestMapping("/demo")
public class DemoTestController {
@Reference(mock = "mock=force:return null")
private IDemoTestService demoTestService;
@RequestMapping("/test")
public String demoTest(){
return demoTestService.demoTest();
}
}
七、Dubbo总结概述
什么是Dubbo?
Duubbo是一个RPC远程调用框架, 分布式服务治理框架
什么是Dubbo服务治理?
服务与服务之间会有很多个Url、依赖关系、负载均衡、容错、自动注册服务,Dubbo服务治理便是治理这些关系。
Dubbo有哪些协议?
默认使用的是dubbo协议,还有Http、RMI、Hessian协议
Dubbo的整个架构流程?
四大模块:
生产者:提供服务
消费者: 调用服务
注册中心:注册信息(redis、zk)
监控中心:调用次数、关系依赖等。
过程:
首先生产者将服务注册到注册中心(zk),使用zk持久节点进行存储
消费者订阅zk节点,一旦有节点变更,zk通过事件通知传递给消费者
消费者可以调用生产者服务,服务与服务之间进行调用,都会在监控中心中,存储一个记录
SpringCloud与Dubbo区别?
都可以实现RPC远程调用
都可以使用分布式、微服务场景下
dubbo使用zk或redis作为作为注册中心,而springcloud使用eureka作为注册中心
dubbo支持多种协议,默认使用dubbo协议而Springcloud只能支持http协议。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137061.html