前言
在日常的开发过程中,都开始从传统架构项目转化为微服务架构模式,把整体项目按照功能模块或者业务等做拆分,形成很多个服务,那么服务与服务之间就会产生调用关系。
常见的远程调用有两种,一种是Feign,另一种是Rpc。在本文介绍Dubbo Rpc与Alibaba SpringCloud、Nacos的集成。
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建提供方项目
项目命名为server-dubbo-provider
-
引入pom依赖
<dependencies> <!-- 提供方Api定义 --> <dependency> <groupId>com.lee</groupId> <artifactId>server-dubbo-provider-api</artifactId> <version>1.0.0</version> </dependency> <!--阿里巴巴 nacos 服务发现--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- cloud-dubbo依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies>
-
创建bootstrap.yml文件
server: port: 10201 spring: application: name: server-dubbo-provider #项目名称 cloud: nacos: discovery: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间id server-addr: 192.168.0.130:8848 #注册中心地址 main: allow-bean-definition-overriding: true mvc: throw-exception-if-no-handler-found: true # Dubbo服务配置 dubbo: scan: base-packages: com.lee.provider.service #扫描包范围 protocol: name: dubbo # 遵循的协议 port: 19003 #dubbo服务端口 registry: address: spring-cloud://localhost # 将dubbo挂载到注册中心,和<dubbo-registry address='zk地址'>一样 management: endpoints: web: exposure: include: '*'
上述配置说明
1. spring.cloud.nacos.discovery.namespace:命名空间id 2. spring.cloud.nacos.discovery.server-addr :注册中心地址 3. dubbo.scan.base-packages:扫描包范围 4. dubbo.protocol.name:遵循的协议 5. dubbo.protocol.port:dubbo服务端口 6. dubbo.registry.address=将dubbo挂载到注册中心,和<dubbo-registry address='zk地址'>一样
-
在server-dubbo-provider-api项目中创建服务接口
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @RequestMapping("/dubboProvider") public interface IDubboProviderService { /** * 获取信息 * @param info * @return */ @GetMapping("/getRemoteDubboInfo") String getRemoteDubboInfo(@RequestParam(value = "info") String info); }
-
在server-dubbo-provider中实现IDubboProviderService接口
server-dubbo-provider-api模块已引入在server-dubbo-provider中@org.apache.dubbo.config.annotation.Service public class DubboProviderServiceImpl implements IDubboProviderService { public String getRemoteDubboInfo(String info) { return "Dubbo Provider Response :"+info; } }
Service注解一定要使用dubbo.config包中的。
二、创建消费方项目
项目命名为server-dubbo-consumer
-
引入pom依赖
<!-- 引入provider-api --> <dependency> <groupId>com.lee</groupId> <artifactId>server-dubbo-provider-api</artifactId> <version>1.0.0</version> </dependency> <!--nacos config配置中心依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-config</artifactId> </dependency> <!-- feign依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> <!--阿里巴巴 nacos 服务发现--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- cloud-dubbo依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <version>2.1.1.RELEASE</version> </dependency>
-
创建bootstrap.yml文件
server: port: 10301 spring: application: name: server-dubbo-consumer # 项目名称 cloud: nacos: discovery: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间 server-addr: 192.168.0.130:8848 #注册中心地址 config: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间 server-addr: 192.168.0.130:8848 #配置中心地址 main: allow-bean-definition-overriding: true mvc: throw-exception-if-no-handler-found: true # Dubbo服务配置 dubbo: protocol: name: dubbo # 遵循的协议 port: 18002 # dubbo端口号,保持唯一 registry: address: spring-cloud://localhost # 将dubbo挂载到注册中心 cloud: subscribed-services: server-dubbo-provider #订阅的服务,可有多个,如果有多个,以逗号隔开。与Dubbo一样 management: endpoints: web: exposure: include: '*'
上述配置说明:
dubbo.cloud.subscribed-services:订阅的服务,可有多个,如果有多个,以逗号隔开。与Dubbo一样
-
编写controller调用
import com.lee.consumer.feign.ProviderFeign; import com.lee.service.IDubboProviderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/consumer") public class ConsumerController { @Autowired private ProviderFeign providerFeign ; @Value("${consumer.name}") private String consumerName ; @Value("${age}") private String age ; @org.apache.dubbo.config.annotation.Reference private IDubboProviderService iDubboProviderService ; /** * dubbo 远程调用 * @param info * @return */ @GetMapping("/getDubboRemoteInfo") public String getDubboRemoteInfo(@RequestParam("info") String info){ return iDubboProviderService.getRemoteDubboInfo(info+",消费者名称:"+consumerName+",年龄:"+age); } /** * feign 远程调用 * @param info * @return */ @GetMapping("/getFeignRemoteInfo") public String getFeignRemoteInfo(@RequestParam("info") String info){ return providerFeign.getRemoteFeignInfo(info+",消费者名称:"+consumerName); } }
上述配置描述
1. @Value("${consumer.name}")表示从nacos上获取配置 2. @org.apache.dubbo.config.annotation.Reference:生成代理对象,就像调用本地方法一样调用远程业务方法 3. 配置文件读取规则: spring.cloud.nacos.config.prefix:为Data ID,默认为服务名称 server-dubbo-consumer spring.cloud.nacos.config.file-extension:默认为.properties spring.cloud.nacos.config.group:默认为DEFAULT_GROUP 如果在多环境配置下可以使用spring.profile.active=online来区分加载生产或者测试环境配置 完整的规则为${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
-
如果有其他的一些公共配置或者比较特殊配置加载,可以使用 ext-config来实现
nacos: discovery: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间 server-addr: 192.168.0.130:8848 #注册中心地址 config: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间 server-addr: 192.168.0.130:8848 #配置中心地址 ext-config: - data-id: test.properties group: DEFAULT_GROUP refresh: true
-
配置中心详情
以项目名称命名的配置文件:server-dubbo-consumer.properties
以ext-config:扩展的配置文件test.properties详情:
-
访问接口
http://localhost:10301/consumer/getDubboRemoteInfo?info=消费者消费
可以看到consumer.name属性不会被ext-config扩展配置覆盖,而年龄这个属性只在扩展配置中存在,所以ext-config优先级小于第一种配置规则。
项目地址:spring-cloud-nacos