Dubbo
Dubbo 项目分层
传送门
Duboo 开发环境的搭建
创建项目
# 创建dubbo项目并删除src目录
# 右键dubbo项目,创建user-api子项目
# 右键dubbo项目,创建user-service子项目
# 右键dubbo项目,创建user-web子项目
parent 父项目限定版本
<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>
</plugins>
</build>
添加 Maven 依赖:user-service、user-web
<!-- spring-boot-starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!-- spring-boot-starter-web user-web项目 需要引入此依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
user-api 项目
假设存在一个 Dubbo RPC API ,由服务提供方为服务消费方暴露接口
public interface UserService {
String sayHello();
}
user-service 项目
实现 UserService 接口
import org.apache.dubbo.config.annotation.Service;
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello";
}
}
修改 SpringBoot 启动类添(加注解@EnableAutoConfiguration)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class);
}
}
添加配置文件 application.yml
spring:
application:
name: dubbo-auto-configuration-provider-demo
dubbo:
scan:
base-packages: com.soulboy.user.service.impl
protocol:
name: dubbo
port: 12345
registry:
address: N/A
user-web 项目
创建 Controller 层
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello() {
return userService.sayHello();
}
}
添加启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class);
}
}
添加配置文件 application.yml
spring:
application:
name: dubbo-auto-configure-consumer-sample
测试
http://localhost:8080/sayHello
hello
Dubbo 架构流程
- Provider:暴露服务的服务提供方。
- Consumer:调用远程服务的服务消费方。
- Registry:服务注册与发现的注册中心。
- Monitor:统计服务的调用次数和调用时间的监控中心。
- Container:服务运行容器。
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 常见开发方式
- XML 配置
- 注解配置(2018 年开始支持)
常见注册中心
- simple 注册中心 ----不支持集群,不适用于生产环境
- Multicast 注册中心 ----开发阶段使用
- zookeeper 注册中心 ----目前企业中最常用,也是官方推荐
- Redis 注册中心 ----虽然支持,但是较少使用
- acos 注册中心 ----后起之秀,传送门。
Zookeeper 整合 Dubbo(注解)
Provider:user-service 项目
添加依赖
<!-- Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
修改配置文件
spring:
application:
name: dubbo-auto-configuration-provider-demo
dubbo:
scan:
base-packages: com.soulboy.user.service.impl
protocol:
name: dubbo
port: 12345
registry:
address: zookeeper://192.168.31.220:2181
启动服务
2019-07-25 13:57:05.937 INFO 9492 --- [ main] o.a.c.f.imps.CuratorFrameworkImpl : Default schema
2019-07-25 13:57:10.450 INFO 9492 --- [68.31.220:2181)] org.apache.zookeeper.ClientCnxn : Opening socket connection to server 192.168.31.220/192.168.31.220:2181. Will not attempt to authenticate using SASL (unknown error)
2019-07-25 13:57:10.453 INFO 9492 --- [68.31.220:2181)] org.apache.zookeeper.ClientCnxn : Socket connection established to 192.168.31.220/192.168.31.220:2181, initiating session
2019-07-25 13:57:10.466 INFO 9492 --- [68.31.220:2181)] org.apache.zookeeper.ClientCnxn : Session establishment complete on server 192.168.31.220/192.168.31.220:2181, sessionid = 0x10014aa999f0014, negotiated timeout = 40000
2019-07-25 13:57:10.475 INFO 9492 --- [ain-EventThread] o.a.c.f.state.ConnectionStateManager : State change: CONNECTED
2019-07-25 13:57:11.805 INFO 9492 --- [ main] o.a.c.f.imps.CuratorFrameworkImpl : Starting
2019-07-25 13:57:11.805 INFO 9492 --- [ main] org.apache.zookeeper.ZooKeeper : Initiating client connection, connectString=192.168.31.220:2181 sessionTimeout=60000 watcher=org.apache.curator.ConnectionState@4f8caaf3
2019-07-25 13:57:11.806 INFO 9492 --- [ main] o.a.c.f.imps.CuratorFrameworkImpl : Default schema
2019-07-25 13:57:16.318 INFO 9492 --- [68.31.220:2181)] org.apache.zookeeper.ClientCnxn : Opening socket connection to server 192.168.31.220/192.168.31.220:2181. Will not attempt to authenticate using SASL (unknown error)
2019-07-25 13:57:16.319 INFO 9492 --- [68.31.220:2181)] org.apache.zookeeper.ClientCnxn : Socket connection established to 192.168.31.220/192.168.31.220:2181, initiating session
2019-07-25 13:57:16.331 INFO 9492 --- [68.31.220:2181)] org.apache.zookeeper.ClientCnxn : Session establishment complete on server 192.168.31.220/192.168.31.220:2181, sessionid = 0x10014aa999f0015, negotiated timeout = 40000
2019-07-25 13:57:16.331 INFO 9492 --- [ain-EventThread] o.a.c.f.state.ConnectionStateManager : State change: CONNECTED
2019-07-25 13:57:16.400 INFO 9492 --- [ main] c.x.user.service.ServiceApplication : Started ServiceApplication in 20.668 seconds (JVM running for 21.827)
2019-07-25 13:57:16.404 INFO 9492 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
Consumer:user-web 项目
添加依赖
<!-- Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
修改配置文件
spring:
application:
name: dubbo-auto-configure-consumer-sample
dubbo:
registry:
address: zookeeper://192.168.31.220:2181
修改 Controller 层代码
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference(version = "1.0.0")
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello() {
return userService.sayHello();
}
}
测试
http://localhost:8080/sayHello
hello
使用 zkCli 连接 zookeeper:并查看数据模型
[zk: 192.168.31.220:2181(CONNECTED) 0] ls /
[zookeeper, dubbo, soulboy0000000000]
[zk: 192.168.31.220:2181(CONNECTED) 1] ls /dubbo
[com.soulboy.user.service.UserService]
[zk: 192.168.31.220:2181(CONNECTED) 10] ls /dubbo/com.soulboy.user.service.UserService
Node does not exist: /dubbo/com.soulboy.user.service.UserService
[zk: 192.168.31.220:2181(CONNECTED) 11] ls /dubbo
[com.xdclass.user.service.UserService]
[zk: 192.168.31.220:2181(CONNECTED) 12] ls /dubbo/com.soulboy.user.service.UserService
[consumers, configurators, routers, providers]
[zk: 192.168.31.220:2181(CONNECTED) 13] ls /dubbo/com.soulboy.user.service.UserService/consumers
[consumer://169.254.192.38/com.xdclass.user.service.UserService?application=dubbo-auto-configure-consumer-sample&category=consumers&check=false&dubbo=2.0.2&interface=com.xdclass.user.service.UserService&methods=sayHello&pid=10400&qos.enable=false&release=2.7.0&revision=1.0.0&side=consumer×tamp=1564035312365&version=1.0.0]
Zookeeper 整合 Dubbo(XML)
Provider:user-service 项目
修改配置文件 properties.yml
spring:
application:
name: dubbo-auto-configuration-provider-demo
新增配置文件 provider.xml
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry address="zookeeper://192.168.31.220:2181"/>
<dubbo:protocol name="dubbo" port="12345"/>
<bean id="userService" class="com.soulboy.user.service.impl.UserServiceImpl"/>
<dubbo:service interface="com.soulboy.user.service.UserService" ref="userService"/>
</beans>
修改实现类,去掉@Service 注解
import org.springframework.stereotype.Service;
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello";
}
}
修改启动类,添加@ImportResource 注解导入 XML 配置文件
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ImportResource;
@EnableAutoConfiguration
@ImportResource("provider.xml")
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class);
}
}
Consumer:user-web 项目
修改配置文件 properties.yml
spring:
application:
name: dubbo-auto-configure-consumer-sample
新增配置文件 consumer.xml
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry address="zookeeper://192.168.31.220:2181"/>
<dubbo:reference id="userService" check="false" interface="com.soulboy.user.service.UserService"/>
</beans>
修改 Controller 层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello() {
return userService.sayHello();
}
}
修改启动类,添加@ImportResource 注解导入 XML 配置文件
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("consumer.xml")
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class);
}
}
测试
http://localhost:8080/sayHello
hello
启动依赖检查
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"。 也就是说 consumer 的启动依赖于 provider。可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false",总是会返回引用,当服务恢复时,能自动连上。
方式一:
@Reference(version = "1.0.0",check =false)
private UserService userService;
方式二:(推荐)
dubbo
registry:
address: zookeeper://192.168.31.220:2181
reference:
com:
#接口的全限定名
soulboy:
user:
service:
UserService:
check: false
各种配置对比
* dubbo.reference.check=false,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。
* dubbo.consumer.check=false,是设置 check 的缺省值,如果配置中有显式的声明,如:<dubbo:reference check="true"/>,不会受影响。
* dubbo.registry.check=false,前面两个都是指订阅成功,但提供者列表是否为空,是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。
配置加载流程
配置优先级是从上往下一次递减,JVM -D 参数是优先级最高的,本地配置文件 dubbo.properties 是优先级最低的。配置来源如下:
- VM System Properties,-D 参数
- Externalized Configuration,外部化配置(2.7 版本)
- ServiceConfig、ReferenceConfig 等编程接口采集的配置
- 本地配置文件 dubbo.properties
超时机制与容错机制
当服务调用失败的时候,默认情况下,dubbo 会进行重试,默认重试次数为 2(不包含第一次),所以一共调用了 3 次。通过 retries="4" 设置重试次数。
<dubbo:reference id="userService" check="false" interface="com.xdclass.user.service.UserService" retries="4"/>
服务提供方配置
- 方法级别(方法优先级设置高于服务优先级设置)
<dubbo:service interface="com.xdclass.user.service.UserService" ref="userService" timeout="3000">
<dubbo:method name="sayHello" timeout="6000"></dubbo:method>
</dubbo:service>
- 服务级别
<dubbo:service interface="com.xdclass.user.service.UserService" ref="userService" timeout="3000"/>
服务消费方配置
如果服务提供方跟服务消费方同时设置了超时时间,则以服务消费方为准。
- 方法级别
- 服务级别
<dubbo:reference id="userService" check="false" interface="com.xdclass.user.service.UserService" timeout="6000"/>
集群容错模式
- Failover Cluster:失败自动切换,当出现失败,重试其它服务器通常用于读操作,但重试会带来更长延迟。可通过
retries="2"
来设置重试次数(不含第一次)。 - Failfast Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
- Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
- Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过
forks="2"
来设置最大并行数。 - Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错 。通常用于通知所有提供者更新缓存或日志等本地资源信息。
按照以下示例在服务提供方和消费方配置集群模式:
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />
Dubbo 多协议配置
缺省协议,使用基于 Mina 1.1.7
和 hessian 3.2.1
的 tbremoting 交互。
- 连接个数:单连接
- 连接方式:长连接
- 传输协议:TCP
- 传输方式:NIO 异步传输
- 序列化:Hessian 二进制序列化
- 适用范围:传入传出参数数据包较小(建议小于 100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
- 适用场景:常规远程服务方法调用
多协议配置示例(HTTP)如下:
API:user-api 项目新增接口
public interface FileService {
void upload(String msg);
}
Provider:user-service 添加实现类
public class FileServiceImpl implements FileService {
@Override
public void upload(String msg) {
System.out.println("服务被调用" + msg);
}
}
修改配置文件
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry address="zookeeper://192.168.31.220:2181"/>
<dubbo:protocol name="dubbo" port="12345"/>
<dubbo:protocol name="http" port="8888"/>
<bean id="userService" class="com.soulboy.user.service.impl.UserServiceImpl"/>
<bean id="fileService" class="com.soulboy.user.service.impl.FileServiceImpl"/>
<dubbo:service interface="com.soulboy.user.service.UserService" ref="userService" timeout="3000"/>
<dubbo:service interface="com.soulboy.user.service.FileService" ref="fileService" protocol="http"/>
</beans>
服务提供者加入相应的依赖
<!-- 多协议配置 http -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlet -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
修改启动类
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ImportResource;
@EnableAutoConfiguration
@ImportResource("provider.xml")
public class ServiceApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ServiceApplication.class).web(WebApplicationType.NONE).run();
}
}
Consumer:user-web 修改配置文件
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry address="zookeeper://192.168.31.220:2181"/>
<dubbo:reference id="userService" check="false" interface="com.soulboy.user.service.UserService"/>
<dubbo:reference id="fileService" check="false" interface="com.soulboy.user.service.FileService"/>
</beans>
修改 Controller 层代码
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@Autowired
private FileService fileService;
@RequestMapping("/sayHello")
public String sayHello() {
return userService.sayHello();
}
@RequestMapping("/upload")
public void upload(@RequestParam(value = "msg") String msg){
fileService.upload(msg);
}
}
测试
http://localhost:8080/upload?msg=123
user-service控制台输出:
服务被调用123
Dubbo 多注册中心
一个 Provider 可以同时想多个注册中心暴露自己的服务。
- 新增 <dubbo:registry address="zookeeper://192.1.1.101:2181"/>
- 多个注册中心使用 id 属性进行区分 id="remote".
- 服务暴露时,多个注册中心使用逗号分隔:registry="local,remote"
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry id="local" address="zookeeper://192.168.31.220:2181"/>
<dubbo:registry id="remote" address="zookeeper://192.168.31.240:2181"/>
<dubbo:protocol name="dubbo" port="12345"/>
<bean id="userService" class="com.soulboy.user.service.impl.UserServiceImpl"/>
<dubbo:service interface="com.soulboy.user.service.UserService" ref="userService" timeout="3000"/ registry="local,remote">
</beans>
Dubbo 服务分组
一个 interface 可能会存在多个实现,这样会导致 Consumer 每次都随机消费同一个接口的不同实现类提供的服务。因此需要 Consumer 对调用做出明确的描述,Provider 可以通过服务分组的概念来解决此类问题。
新增实现类
public class UserServiceImpl2 implements UserService {
@Override
public String sayHello() {
return "hello 2";
}
}
修改 Provider 配置文件
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry address="zookeeper://192.168.31.220:2181"/>
<dubbo:protocol name="dubbo" port="12345"/>
<bean id="userService" class="com.soulboy.user.service.impl.UserServiceImpl"/>
<dubbo:service group="user1" interface="com.soulboy.user.service.UserService" ref="userService" timeout="3000"/>
<bean id="userService2" class="com.soulboy.user.service.impl.UserServiceImpl2"/>
<dubbo:service group="user2" interface="com.soulboy.user.service.UserService" ref="userService2" timeout="3000"/>
</beans>
修改 Consumer 配置文件
<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.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:registry address="zookeeper://192.168.31.220:2181"/>
<dubbo:reference id="userService" group="user2" interface="com.soulboy.user.service.UserService"/>
</beans>
测试
# 多次刷新依然是消费group="user2" 的接口实现类
http://localhost:8080/sayHello
hello 2
Dubbo 服务多版本化
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
- 在低压力时间段,先升级一半提供者为新版本 再将所有消费者升级为新版本 然后将剩下的一半提供者升级为新版本。
- 一旦服务提供者制定了版本,那么所有的服务消费者也是需要去指定相应的版本。
- 建议:暴露服务的时候,最好都指定下服务的版本,方便后续接口的不兼容升级。
<!-- 老版本服务提供者配置 -->
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<!-- 老版本服务消费者配置 -->
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
<!-- 新版本服务提供者配置 -->
<dubbo:service interface="com.foo.BarService" version="2.0.0" />
<!-- 新版本服务消费者配置 -->
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
管控台 Dubbo-ops
管控台的主要功能:服务查询,服务治理(包括 Dubbo2.7 中新增的治理规则)以及服务测试、配置管理。
# 环境准备
maven npm
# 克隆项目到本地
[root@localhost test]# git clone https://github.com/apache/incubator-dubbo-ops.git
# 修改配置文件:指定注册中心地址(本地就有zookeeper,因此不修改修改)
[root@localhost test]# vim incubator-dubbo-ops/dubbo-admin-server/src/main/resources/application.properties
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
# 构建
[root@localhost test]# cd /test/incubator-dubbo-ops/
[root@localhost incubator-dubbo-ops]# mvn clean package
# 启动
[root@localhost test]# mvn --projects dubbo-admin-server spring-boot:run
或者
[root@localhost test]# cd dubbo-admin-distribution/target
[root@localhost dubbo-admin-distribution]# java -jar dubbo-admin-0.1.jar
# 访问
http://192.168.31.220:8080
Dubbo-admin
添置条件安装npm
安装 Dubbo-admin
# 下载
git clone https://github.com/apache/dubbo-admin.git
# 配置
vim dubbo-admin-server/src/main/resources/application.properties
server.port=7001
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
# build
mvn clean package
# 启动
cd dubbo-admin-distribution/target
nohup java -jar dubbo-admin-0.1.jar &
# 访问
http://192.168.31.251:7001