前几章Nacos(二):Spring Cloud项目中Nacos作为注册中心 、 Nacos(三):Nacos集成OpenFegin 、Nacos(四):Nacos作为配置中心 描述了 Nacos作为注册中心的使用方式,本章使用Nacos 作为配置中心。
本章是在 之前 nacos-demo 的基础上 集成的
nacos-demo gitee地址:https://gitee.com/yijiecaomin/nacos-demo
Dubbo Spring Cloud 构建在原生的Spring Cloud 之上,其服务治理方面的能力可认为是Spring Cloud Plus,不仅完全覆盖Spring Cloud原生特性[5],而且提供更为稳定和成熟的实现, 特性比如如下:
功能组件 | Spring Coud | Dubbo Spring Cloud |
---|---|---|
分布式配置 | Git、Zookeeper、Consul、JDBC | Spring Cloud 分布式配置 + Dubbo 配置中心[6] |
服务注册与发现(Service registration and discovery) | Eureka、Zookeeper、Consul | Spring Cloud 原生注册中心[7] + Dubbo 原生注册中心[8] |
负载均衡(Load balancing) | Ribbon(随机、轮询等算法) | Dubbo 内建实现(随机、轮询等算法 + 权重等特性) |
服务熔断(Circuit Breakers) | Spring Cloud Hystrix | Spring Cloud Hystrix + Alibaba Sentinel[9] 等 |
服务调用(Service-to-service calls)) | Open Feign、RestTemplate | Spring Cloud 服务调用 + Dubbo @Reference |
链路跟踪(Tracing) | Spring Cloud Sleuth[10] + Zipkin[11] | Zipkin、opentracing 等 |
Dubbo Spring Cloud 官方文档
在Spring Cloud构建的微服务系统中,大多数的开发者使用都是官方提供的Feign组件来进行内部服务通信,这种声明式的HTTP客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用Feign消费服务的时候,相比较Dubbo这种RPC框架而言,性能堪忧。
虽说在微服务架构中,会讲按照业务划分的微服务独立部署,并且运行在各自的进程中。微服务之间的通信更加倾向于使用HTTP这种简答的通信机制,大多数情况都会使用REST API。这种通信方式非常的简洁高效,并且和开发平台、语言无关,但是通常情况下,HTTP并不会开启KeepAlive功能,即当前连接为短连接,短连接的缺点是每次请求都需要建立TCP连接,这使得其效率变的相当低下。
对外部提供REST API服务是一件非常好的事情,但是如果内部调用也是使用HTTP调用方式,就会显得显得性能低下,Spring Cloud默认使用的Feign组件进行内部服务调用就是使用的HTTP协议进行调用,这时,我们如果内部服务使用RPC调用,对外使用REST API,将会是一个非常不错的选择,恰巧,Dubbo Spring Cloud给了我们这种选择的实现方式。
创建子模块 nacos-dubbo-api
package com.example.dubbo.api;
public interface HelloService {
String syHello(String name);
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos-demo</artifactId>
<groupId>com.example</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-dubbo-provider</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>nacos-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
server.port=8020
spring.application.name=nacos-dubbo-provider
##################nacos 配置###################################
## 名称空间
spring.cloud.nacos.discovery.namespace=evone
## nacos 链接账号 没有设置不可以不选
spring.cloud.nacos.username=evone
# nacos 链接 密码 没有设置不可以不选
spring.cloud.nacos.password=evone123456
# spring.cloud.nacos.server-addr=192.168.104.110:8848 使用的nacos改了端口号, 默认端口 8848
spring.cloud.nacos.server-addr=192.168.104.110:16848
##################dubbo 配置##################################
#指定 Dubbo 服务实现类的扫描基准包
#dubbo.scan.base-packages=com.example.dubbo
#Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
dubbo.protocol.name=dubbo
#Dubbo 服务注册中心配置,其中子属性address 的值 "spring-cloud://192.168.44.129",说明挂载到 Spring Cloud 注册中心
dubbo.registry.address=spring-cloud://192.168.104.110
#在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
spring.main.allow-bean-definition-overriding=true
package com.example.dubbo;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient// 开启nacos 服务发现
@DubboComponentScan
public class NacosDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboProviderApplication.class, args);
}
}
package com.example.dubbo.service.impl;
import com.example.dubbo.api.HelloService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class HelloServiceImpl implements HelloService {
public String syHello(String name) {
return "hello "+name;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos-demo</artifactId>
<groupId>com.example</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-dubbo-consumer</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>nacos-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
server.port=8021
spring.application.name=nacos-dubbo-consumer
##################nacos 配置###################################
## 名称空间
spring.cloud.nacos.discovery.namespace=evone
## nacos 链接账号 没有设置不可以不选
spring.cloud.nacos.username=evone
# nacos 链接 密码 没有设置不可以不选
spring.cloud.nacos.password=evone123456
# spring.cloud.nacos.server-addr=192.168.104.110:8848 使用的nacos改了端口号, 默认端口 8848
spring.cloud.nacos.server-addr=192.168.104.110:16848
##################dubbo 配置##################################
#指定 Dubbo 服务实现类的扫描基准包
#dubbo.scan.base-packages=com.example.dubbo
#Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
dubbo.protocol.name=dubbo
#Dubbo 服务注册中心配置,其中子属性address 的值 "spring-cloud://192.168.44.129",说明挂载到 Spring Cloud 注册中心
dubbo.registry.address=spring-cloud://192.168.104.110
# dubbo.cloud.subscribed-services 默认 *
dubbo.cloud.subscribed-services=nacos-dubbo-provider
#在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
spring.main.allow-bean-definition-overriding=true
package com.example.dubbo;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient// 开启nacos 服务发现
@DubboComponentScan
public class NacosDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboConsumerApplication.class, args);
}
}
package com.example.dubbo.controller;
import com.example.dubbo.api.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@DubboReference
private HelloService helloService;
@GetMapping("/syHello")
public String syHello(String name){
return helloService.syHello(name);
}
}
请求http://127.0.0.1:8021/syHello
如果对你有帮助,加个关注把~