Dubbo+nacos+springboot
说明:Dubbo不需要搭建单独的dubbo服务,服务提供方和服务消费方引入dubbo相关jar包和启动注册中心(nacos)即可。
版本 dubbo:3.0.0,nacos:2.0.0
1、启动nacos server
https://www.cnblogs.com/yangyongjie/p/15188286.html
2、服务提供方
1)引入依赖
<!-- dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.0.0</version> </dependency>
2)application.properties配置
server.port=8080 # dubbo dubbo.application.name=dubbo-provider dubbo.protocol.name=dubbo dubbo.protocol.port=10001 # Nacos registry address dubbo.registry.address=nacos://127.0.0.1:8848
3)启动类上添加 @EnableDubbo
4)对外提供的服务实现类添加 @DubboService
版本2:
参考:Dubbo 外部化配置 、 nacos dubbo
1)引入依赖
<!--The all in one project of dubbo--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.0</version> </dependency> <!--The Nacos registry module of Dubbo project--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>3.0.0</version> </dependency> <!-- <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.0.0</version> </dependency>-->
2)resource目录下新建 dubbo.properties文件
## application dubbo.application.name = dubbo-provider ## Nacos registry address dubbo.registry.address = nacos://127.0.0.1:8848 ##如果要使用自己创建的命名空间可以使用下面2种方式 #dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932 #dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932 ## Dubbo Protocol dubbo.protocol.name = dubbo dubbo.protocol.port = 8889 # Provider @Service version demo.service.version=1.0.0
3)启动类上添加
/** * 注解 @EnableDubbo 激活 Dubbo注解驱动以及外部化配置,其scanBasePackages属性扫描指定Java包, * 将所有标注 @DubboService 的服务接口实现类暴露为 Spring Bean,随即被导出 Dubbo 服务 */ @EnableDubbo(scanBasePackages = "com.yang.dubbo.provider.service") @PropertySource("classpath:dubbo.properties") @SpringBootApplication public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } }
4)对外提供的服务实现类添加 @DubboService
说明:注解 @EnableDubbo 激活 Dubbo 注解驱动以及外部化配置,其 scanBasePackages 属性扫描指定 Java 包,将所有标注 @DubboService 的服务接口实现类暴露为 Spring Bean,随即被导出 Dubbo 服务
@PropertySource 是 Spring Framework 3.1 引入的标准导入属性配置资源注解,它将为 Dubbo 提供外部化配置
3、服务消费方
1)添加依赖如上
2)application.properties配置
server.port=8081 dubbo.application.name=dubbo-consumer dubbo.consumer.timeout=5000 dubbo.registry.address=nacos://127.0.0.1:8848
3)启动类上添加 @EnableDubbo
4)引入服务提供的jar包
@DubboReference private TestService testService;
版本2:
1)resource目录下新建 dubbo.properties文件:
## Dubbo Application info dubbo.application.name = dubbo-consumer-gateway ## Nacos registry address dubbo.registry.address = nacos://127.0.0.1:8848 ##如果要使用自己创建的命名空间可以使用下面2种方式 #dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932 #dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932 #qos在线运维 dubbo.application.qosEnable=false dubbo.application.qosPort=22222
2)启动类上新增以下注解
@EnableDubbo
@PropertySource(value = "classpath:/dubbo.properties")
3)调用dubbo接口(泛化调用)
ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>(); // serviceKey referenceConfig.setInterface(gatewayMethodPo.getServiceKey()); referenceConfig.setGeneric("true"); ReferenceConfigCache cache = ReferenceConfigCache.getCache(); // cache.get方法中会缓存 Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig GenericService genericService = cache.get(referenceConfig); // 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效! Map<String, Object> paramMap = gatewayContext.getDataMap(); try { Object result = genericService.$invoke(gatewayMethodPo.getMethodName(), new String[]{"java.util.Map"}, new Object[]{paramMap}); handleResponse.info(result); } catch (GatewayException e) { LOGGER.error("error:" + e.getMessage(), e); handleResponse.info(e.getErrorCode(), e.getErrorMessage()); return false; }
4、dubbo泛化调用:
不用引入服务提供方的jar包,可通过GenericService 调用所有服务实现
泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。
1)通过Spring使用泛化调用
@Configuration public class ReferenceConfiguration { @Bean public GenericService testServiceReference() { ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>(); referenceConfig.setInterface("com.yang.dubbo.provider.service.TestService"); referenceConfig.setGeneric("true"); GenericService genericService = referenceConfig.get(); return genericService; } }
在Java代码中装配testServiceReference
@Autowired private GenericService testServiceReference; @Test void genericTest() { Object result = testServiceReference.$invoke("test", null, null); System.out.println(String.valueOf(result)); }
2)通过API方式泛化调用
ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>(); // serviceKey referenceConfig.setInterface(gatewayMethodPo.getServiceKey()); referenceConfig.setGeneric("true"); ReferenceConfigCache cache = ReferenceConfigCache.getCache(); // cache.get方法中会缓存 Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig GenericService genericService = cache.get(referenceConfig); // 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效! try { // 参数为String的情况 // Object result = genericService.$invoke("test", new String[]{"java.lang.String"}, new Object[]{"yangyongjie"}); // 参数为Map的情况 // Map<String, Object> paramMap = gatewayContext.getDataMap(); // Object result = genericService.$invoke(gatewayMethodPo.getMethodName(), new String[]{"java.util.Map"}, new Object[]{paramMap}); // 参数类型为POJO的情况 // 用Map表示POJO参数,如果返回值为POJO也将自动转成Map Map<String, Object> person = new HashMap<String, Object>(4); person.put("name", "xxx"); person.put("password", "yyy"); // 类型为接口provider的参数pojo的全路径 Object result = genericService.$invoke(gatewayMethodPo.getMethodName(), new String[]{"com.yang.dubbo.provider.pojo.Person"}, new Object[]{person}); } catch (GatewayException e) { LOGGER.error("error:" + e.getMessage(), e); }
5、使用zk作为注册配置中心
下载zk:https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
附录
Dubbo 融合 Nacos 成为注册中心:https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
END.