Nacos+Dubbo构建微服务示例项目
基本结构
-
Nacos:开源的注册中心和配置中心,可直接下载打包应用,启动即可
-
DemoInterface:服务接口定义
-
DemoService:实现服务接口,并注册为Provider
-
DemoClient:服务消费者,通过自动注入服务实例,可直接调用服务接口
Nacos
Nacos-Server
部署相对简单,它的发布版本见Github的Releases页面。单机模式在不修改配置的前提下直接启动,使用的是内存数据库,重启后数据会被清空。
DemoInterface
这个工程用于在服务的提供者和消费者之间进行一个接口设计,和通常的Java工程没有区别,这里仅列出接口代码。
public interface DemoService {
String sayHello(String name);
}
DemoService
配置文件application.properties
#当前服务/应用的名字
dubbo.application.name = demo-service-provider
#注册中心的协议和地址
dubbo.registry.address = nacos://127.0.0.1:8848
#服务版本及分组名
dubbo.service.version = 1.0.0
dubbo.service.group = demo
#通信规则(通信协议和接口)
dubbo.protocol.host = 127.0.0.1
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
#连接监控中心
dubbo.monitor.protocol = registry
#开启包扫描,可替代 @EnableDubbo 注解
##dubbo.scan.base-packages=com.apollo.dubbo.Services
Maven依赖
<dependencies>
<dependency>
<groupId>com.apollo.dubbo</groupId>
<artifactId>DemoInterface</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
这里依赖项比较多,尤其是dubbo被贡献给apache后,包名从com.alibaba.dubbo
变成了org.apache.dubbo
,容易产生混淆,这里统一使用org.apache.dubbo
。
启动代码,使用@EnableDubbo
注解激活服务注册功能
@EnableDubbo
@SpringBootApplication
public class DemoServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DemoServiceProviderApplication.class, args);
}
}
服务代码,使用@Service
注解激活服务定义,注意version
和group
属性都是必须的
@Service(version = "${dubbo.service.version}", group = "${dubbo.service.group}")
@Component
public class DemoServiceImpl implements DemoService {
/**
* The default value of ${dubbo.application.name} is ${spring.application.name}
*/
@Value("${dubbo.application.name}")
private String serviceName;
public String sayHello(String name) {
return String.format("[%s] : Hello, %s", serviceName, name);
}
}
这里和Spring Cloud
不同的是,dubbo服务不一定需要使用Web方式提供服务,缺省的dubbo协议实际上就是RMI协议,效率要比Web方式更高。
DemoClient
通常Consumer会对外提供RestWeb接口,内部则通过dubbo协议访问服务提供方。
配置文件application.properties
spring.application.name = demo-consumer
# 对外提供的Web服务地址
server.port = 8900
dubbo.registry.address = nacos://127.0.0.1:8848
dubbo.service.version = 1.0.0
dubbo.service.group = demo
dubbo.protocol.host = 127.0.0.1
Maven依赖
<dependencies>
<dependency>
<groupId>com.apollo.dubbo</groupId>
<artifactId>DemoInterface</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
这里增加了spring-boot-starter-web
包,用于对外提供Web服务。
作为一个标准的SpringBoot应用,启动代码和通常没有区别
@SpringBootApplication
public class DemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConsumerApplication.class, args);
}
}
消费代码,使用@Reference
注解直接进行服务实例的注入
@RestController
public class DemoConsumer {
@Reference(version = "${dubbo.service.version}", group="${dubbo.service.group}")
private DemoService demoService;
@GetMapping
public String test() {
String info = demoService.sayHello("dubbo");
return info;
}
}
Dubbo的消费者代码可以通过接口进行访问,要比Spring Cloud的RestWeb接口访问更直观,也更容易管理。
其它
同样的,启动顺序为:Nacos-Server -> DemoService -> DemoClient
由于该解决方案涉及到了多个开源项目(Nacos,Dubbo,SpringBoot),配置起来略显繁琐,而且由于Dubbo正处于快速发展期,代码也不够稳定,网上许多文章都已过时,开发过程中遇到的问题解决起来比较困难,但是由于Dubbo支持接口方式的消费方式,较好地满足了开发过程的约束要求,同时效率也要优于Web方式的调用,因此可以考虑使用。
源码已上传码云:com.apollo.dubbo.demo