Dubbo并不仅仅只是一个RPC框架,他还是一个服务治理框架,它提供了对服务的统一管理、以及服务的路由等功能。
在上面的案例中,我们只是掩饰了Dubbo作为RPC通信的点对点服务,但是就像咱们前面在学习spring cloud的内容一样,服务多了以后,如何管理和维护,以及动态发现呢?
而且,从Dubbo的架构图中可以看到,Dubbo天然就支持服务注册与发现,官方最早推荐的服务注册中心是zookeeper,当然,目前dubbo能够支持的注册中心已经非常多了,比如consul、etcd、nacos、sofa、zookeeper、eureka、redis等等,很显然,Dubbo已经在往一个独立微服务解决方案的生态在发展。
集成Zookeeper作为服务注册中心
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
dubbo.application.name=dubbo_provider
dubbo.registry.address=zookeeper://${zookeeper.address:127.0.0.1}:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#dubbo.provider.token=true
以API 配置的方式来配置你的 Dubbo 应用
通过API编码方式组装配置,启动Dubbo,发布及订阅服务。此方式可以支持动态创建ReferenceConfig/ServiceConfig,结合泛化调用可以满足API Gateway或测试平台的需要。
通过ServiceConfig暴露服务接口,发布服务接口到注册中心。
public class ProviderApi {
public static void main(String[] args) throws IOException {
new EmbeddedZooKeeper(2181, false).start();
// 服务实现
UserService demoService = new UserServiceImpl();
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("demo-provider");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://127.0.0.1:2181");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
ServiceConfig<UserService> service = new ServiceConfig<UserService>(); // 此实例很
重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
serviceConfig.setTimeout(1200000);
service.setInterface(UserService.class);
service.setRef(demoService);
service.setVersion("1.0.0");
// 暴露及注册服务
service.export();
// 挂起等待(防止进程退出)
System.in.read();
}
}
@Test
public void api() {
// 1、应用信息
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("dubbo_consumer");
//2、注册信息
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://127.0.0.1:2181");
//引用API
ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(applicationConfig);
referenceConfig.setRegistry(registry);
referenceConfig.setInterface(UserService.class);
//服务引用 。这个引用过程非常重,如果想用api方式去引用服务,这个对象需要缓存
UserService userService = referenceConfig.get();
System.out.println(userService.queryUser("jingtian"));
}
public class BootstrapApi {
public static void main(String[] args) {
new EmbeddedZooKeeper(2181, false).start();
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://127.0.0.1:2181");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
ServiceConfig<UserService> demoServiceConfig = new ServiceConfig<>();
demoServiceConfig.setInterface(UserService.class);
demoServiceConfig.setRef(new UserServiceImpl());
demoServiceConfig.setVersion("1.0.0");
// 第二个服务配置
ServiceConfig<MockService> fooServiceConfig = new ServiceConfig<>();
fooServiceConfig.setInterface(MockService.class);
fooServiceConfig.setRef(new MockServiceImpl());
fooServiceConfig.setVersion("1.0.0");
// 通过DubboBootstrap简化配置组装,控制启动过程
DubboBootstrap.getInstance()
.application("demo-provider") // 应用配置
.registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注册中心配置
.protocol(protocol) // 全局默认协议配置
.service(demoServiceConfig) // 添加ServiceConfig
.service(fooServiceConfig)
.start() // 启动Dubbo
.await(); // 挂起等待(防止进程退出)
}
}
public class BootstrapApi {
public static void main(String[] args) {
// 引用远程服务
ReferenceConfig<UserService> demoServiceReference = new
ReferenceConfig<UserService>();
demoServiceReference.setInterface(UserService.class);
demoServiceReference.setVersion("1.0.0");
ReferenceConfig<MockService> fooServiceReference = new
ReferenceConfig<MockService>();
fooServiceReference.setInterface(MockService.class);
fooServiceReference.setVersion("1.0.0");
// 通过DubboBootstrap简化配置组装,控制启动过程
DubboBootstrap bootstrap = DubboBootstrap.getInstance();
bootstrap.application("demo-consumer") // 应用配置
.registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注册中心配置
.reference(demoServiceReference) // 添加ReferenceConfig
.reference(fooServiceReference)
.start(); // 启动Dubbo
// 和本地bean一样使用demoService
// 通过Interface获取远程服务接口代理,不需要依赖ReferenceConfig对象
UserService demoService =
DubboBootstrap.getInstance().getCache().get(UserService.class);
System.out.println(demoService.queryUser("jack"));
MockService fooService =
DubboBootstrap.getInstance().getCache().get(MockService.class);
System.out.println(fooService.queryArea("1"));
}
}
(注册中心 配置中心 元数据中心)
了解 Dubbo 的三大中心化组件,它们各自的职责、工作方式。
作为一个微服务框架,Dubbo sdk 跟随着微服务组件被部署在分布式集群各个位置,为了在分布式环境下实现各个微服务组件间的协作, Dubbo 定义了一些中心化组件,这包括: