nacos结合dubbo2.7.12、springboot分析
一、dubbo原理简介
问题:并发很多的时候Tomcat处理并发请求有限,多模块进行通信
解决:dubbo是一个RPC和SOA的框架,提供远程通信和服务治理功能。
原理图如下:
image.png
container就是springboot里的container,初始化启动provider,将服务端接口注册到注册中心,registry实现服务的url地址注册和地址调度,最终访问通过地址找实际服务,consumer消费者会轮训订阅想订阅的服务,monitor提供监控。
二、nacos简介
1、主要应用
2、nacos注册中心
服务的注册:包括服务所在的ip、端口、版本和协议
服务发现:从注册中心获取注册的服务实例
其他组件对比-引自阿里云微服务课程.png
数据模型-引自阿里云微服务课程.png
3、nacos注册中心原理
注册:
如下实例,注册中心存在一个类似于服务容器(serviceHolder)进行服务管理,两个提供者provider1/2提供服务1service1的实例instance1/2
服务发现:
如下实例:左侧为订阅服务,本地维护一个服务列表,获取实例从本地获取,实例变更后从注册中心重新获取;右侧为直接从注册中心获取实例
服务发现实例-引自参考链接3.jpg
4、windows安装nacos
进入git下载地址下载nacos-server的zip包,本地解压,运行startup文件
报错如下:
解决:https://www.freesion.com/article/87611162023/,默认集群改成单机即可。
启动成功后可访问:http://localhost:8848/nacos/#
image.png
集群部署参考链接
主要是两步:
1、conf目录下修改cluster.conf文件添加节点地址
2、conf目录下修改application.properties添加数据库信息
然后验证集群状态即可。
4、nacos配置中心
Nacos配置管理,通过Namespace(命名空间)、group、 Data ID(配置中心)能够定位到一个配置集。
如下:nacos的注册中心和配置中心在可视化界面里的关系如下:
模型.png
这里说下另一个功能作为配置中心
主流配置中心对比.png
nacos的读写性能还是很高的。
理解配置中心要先理解几个名词
namespace:命名空间,用作环境隔离,默认是public,可以自定义命名空间(如test)
添加自定义命名空间.png
不同空间切换.png
public空间之外的空间,标识该空间的是namespace_id(dev后边的一串字符串)的,对应的是springboot里spring.cloud.nacos.discovery.namespace配置项。
Group:实现服务注册信息或者DataId的分组管理机制
DateId:我们定义一个配置文件可能是一群配置的结合,配置集合的ID即Data ID,Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性(官方标注非强制)
新建配置.png
新建配置.png
默认的group是DEFAULT_ GROUP也可以自定义
添加后在springboot通过@Value来拉取配置信息@RefreshScope实现自动刷新。
5、项目使用
使用环境:dubbo+nacos注册中心
测试项目结构如下
总pom依赖
<!-- Spring Cloud Nacos Service Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
provider配置文件
server.port=8087
spring.application.name=nacos-provider
dubbo.application.name=annotation-provider-TEST
dubbo.scan.base-packages=nacos.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.provider.validation=true
dubbo.cloud.subscribed-services= ''
dubbo.registry.address=nacos://localhost:8848
#spring.cloud.nacos.registry.namespace=c16585d6-eea4-4a86-8ee7-602f787eb32e
#spring.cloud.nacos.registry.server-addr=192.168.140.1:8848
spring.profiles.active=dev
spring.main.allow-bean-definition-overriding=true
provider提供的服务,只需要添加@DubboService就可以注册到nacos上
package nacos.service.impl;
import nacos.service.TestService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class TestServiceImpl implements TestService {
@Override
public String getStatus(Integer stats) {
if (stats==1){
return "对";
} else {
return "错";
}
}
}
再看下consumer的配置,需要注意的是subscribed-services需要明确添加哪些provider,否则会报找不到服务的错(dubbo.rpc.RpcException: Failed to invoke the method)
server.port=8080
spring.application.name=nacos-consumer
dubbo.application.name=annotation-consumer-TEST
dubbo.scan.base-packages=nacos.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.provider.validation=true
#comsumer订阅的服务配置很重要,否则会报找不到服务的错
dubbo.cloud.subscribed-services= 'nacos-provider'
dubbo.consumer.check=false
dubbo.consumer.validation=true
dubbo.consumer.retries=-1
dubbo.registry.address=nacos://localhost:8848
#spring.cloud.nacos.registry.namespace=c16585d6-eea4-4a86-8ee7-602f787eb32e
#spring.cloud.nacos.registry.server-addr=192.168.140.1:8848
spring.profiles.active=dev
spring.main.allow-bean-definition-overriding=true
comsumer的pom依赖需要引入provider,调用服务通过@DubboReference注解
package nacos.controller;
import nacos.service.TestService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@DubboReference
TestService testService;
@GetMapping("/getStr")
public String getStr(Integer stats){
String testStr = testService.getStatus(stats);
return testStr;
}
}
启动的时候先启动provider在启动comsumer,否则因为注册为完成获取服务失败
image.png
点进详情可以看见具体的服务信息
image.png
浏览器/postman上请求comsumer的接口可返回具体数据。
此外还需要注意的是:
1、实体类传输需要序列化
2、使用hutool工具做时间传输
3、dubbo传输数据大小上限为8M
6、dubbo调用流程
更新中.....
服务暴露:
一个限流的组件
三、sentinel限流
image.png
image.png
image.png
通过页面即可进行接口级别流量控制,更深入的可以自行了解下
参考链接
1、dubbo注解
2、dubbo官方文档
3、官方文档
4、nacos注册与发现原理
5、nacos+springboot实现注册和发现
6、OpenFeign