Nacos官方文档:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
一、下载与启动
先从官方文档地址下载nacos注册中心,默认点击startup.cmd是集群模式启动,解压后在bin目录下输入cmd进入命令行,这里我们使用单机模式启动startup.cmd -m standalone 启动后进入:http://127.0.0.1:8848/nacos 管理界面查看,nacos默认账号密码都是nacos
二、Nacos集成Dubbo、OpenFeign
新建生产者模块并添加nacos、dubbo、openfeign相关依赖,编写application.yml配置文件
<properties>
<spring.boot.version>2.7.13</spring.boot.version>
<spring.cloud.version>3.1.5</spring.cloud.version>
<dubbo.version>3.2.3</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.5.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.2</version>
</dependency>
<!--cloud相关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.1.5</version>
</dependency>
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
</dependencies>
</dependencyManagement>
所需依赖如上,需要注意SpringBoot和Nacos、Dubbo需要对应的版本关系才能正常启动。本文使用的是SpringBoot 2.7.13 + SpringCloud 3.1.5 + Nacos 2021.0.5 + Dubbo3.2.3。
SpringCloudAlibaba相关组件版本说明:版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
(1)服务提供者模块
yml配置文件如下:
server:
port: 8001
spring:
application:
name: provider # 应用名
cloud: ## nacos服务地址
nacos:
discovery:
server-addr: 127.0.0.1:8848
main:
# Spring Boot2.1及更高的版本需要设定
allow-bean-definition-overriding: true
dubbo:
scan:
base-packages: com.cloud.service
protocol:
port:
20881
registry:
address: nacos://127.0.0.1:8848
完成配置后编写Dubbo接口,Dubbo接口需要使用@DubboService注解
package com.cloud.service;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class DubboTestServiceImp implements DubboTestService {
@Override
public String dubboTest() {
return "我是服务提供者:这是一个dubbo测试";
}
}
Controller层定义两个接口,用来给消费者用openFeign的方式调用
package com.cloud.controller;
import com.cloud.vo.TestVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/provider")
public class ProviderTest {
@Value("${server.port}")
private String port;
@GetMapping("/opfeign-get-send")
public String sendGet() {
return "我是服务提供者:"+port;
}
@PostMapping("/openfeign-post-send")
public String sendPost(@RequestBody TestVO testVO) {
return testVO.toString();
}
}
在启动类加上@EnableDubbo注解
package com.cloud;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
@DubboComponentScan
public class CloudServerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudServerApplication.class, args);
}
}
启动服务后登录Nacos管理界面查看提供者服务是否注册成功,可以看到服务列表已存在
(2)消费者模块
Dubbo服务注册到nacos后,新建消费者模块consumer,同样添加和提供者相同依赖和编写application.yml配置文件如下
server:
port: 8002
spring:
application:
name: consumer # 应用名
cloud: ## nacos服务地址
nacos:
discovery:
server-addr: 127.0.0.1:8848
dubbo:
registry:
address: nacos://127.0.0.1:8848
# dubbo 协议
protocol:
name: dubbo
port: -1 #端口号自增
cloud:
subscribed-services: provider #订阅服务提供者
scan:
base-packages: com.cloud.service
application:
qosEnable: true
qosPort: 33333 #默认qos端口服务提供者已经使用需指定
qosAcceptForeignIp: false
feign:
hystrix:
enable: true #开启服务熔断
编写和服务提供者相同Dubbo接口,注意:包名也要和提供者一致,不然启动消费者后会找不到服务提供接口。
package com.cloud.service;
public interface DubboTestService {
public String dubboTest();
}
接下来新建Feign接口用来调用远程服务,OpenFign加入了SpringMVC的注解,使用起来只要保持和服务提供者接口保持一致就可以了,@FeignClient的value代表提供者服务名
package com.cloud.feign;
import com.cloud.feginvo.TestVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(value = "provider")
public interface ProviderFeign {
@GetMapping("/provider/opfeign-get-send")
String send();
@PostMapping("/provider/openfeign-post-send")
String sendPost(@RequestBody TestVO testVO);
}
启动类需要加上@ EnableFeignClients注解
package com.cloud;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
@DubboComponentScan
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
三、测试
编码完成之后我们测试一下在消费者中调用远程服务,这里需要添加Junit和springbootTest相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.7.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
添加单元测试
import com.cloud.ConsumerApplication;
import com.cloud.feginvo.TestVO;
import com.cloud.feign.ProviderFeign;
import com.cloud.service.DubboTestService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@SpringBootTest(classes = ConsumerApplication.class)
@RunWith(SpringRunner.class)
public class RemoteTest {
@Resource
private ProviderFeign feignclint;
@DubboReference
private DubboTestService dubboService;
@Test
public void dubboTest() {
String response = dubboService.dubboTest();
System.out.println(response);
}
@Test
public void feignGetTest() {
String response = feignclint.send();
System.out.println(response);
}
@Test
public void feignPostSend() {
TestVO testVO = new TestVO("aa", "bb");
String response = feignclint.sendPost(testVO);
System.out.println(response);
}
}
测试结果如下,分别在消费者测试Dubbo和Oenfign的远程调用都成功
Demo项目结构如下
四、总结
Dubbo和OpenFeign都是Java中比较流行的RPC框架,它们的作用都是为了方便不同的服务之间进行远程调用。但是它们之间还是有一定的区别的。
(1)通信方式不同
Dubbo的通信方式是基于TCP长连接的,而OpenFeign则是基于HTTP的RESTful API调用。这就决定了它们在网络通讯上的差异,Dubbo相对来说更适合在局域网内进行服务调用,而OpenFeign也更适合在不同地区,不同系统之间进行服务调用。
(2)功能和特性不同
Dubbo提供了更完整的分布式服务治理方案,包括服务发现、负载均衡、容错、路由、监控等功能,而OpenFeign则主要关注于服务调用的API设计和声明式的接口调用,没有Dubbo那么强大的治理能力。
(3)使用场景不同
基于以上两点区别,Dubbo更适合于微服务架构方案下的RPC调用,服务数量巨大、网络环境复杂的场景,而OpenFeign更适合于RESTful风格的API调用,能够方便地与不同的编程语言进行交互,更加适合于快速原型开发和轻量级的应用开发。
总之,Dubbo和OpenFeign都有自己适合的使用场景和优势,具体选择哪个框架取决于项目的需求和技术架构方案。