nacos结合dubbo2.7.12、springboot分析

2021-07-15  本文已影响0人  灿烂的GL

一、dubbo原理简介

问题:并发很多的时候Tomcat处理并发请求有限,多模块进行通信
解决:dubbo是一个RPC和SOA的框架,提供远程通信和服务治理功能。
原理图如下:

原理图.png
image.png

container就是springboot里的container,初始化启动provider,将服务端接口注册到注册中心,registry实现服务的url地址注册和地址调度,最终访问通过地址找实际服务,consumer消费者会轮训订阅想订阅的服务,monitor提供监控。


二、nacos简介

1、主要应用

主要应用-引自阿里云微服务课程.png

2、nacos注册中心
服务的注册:包括服务所在的ip、端口、版本和协议
服务发现:从注册中心获取注册的服务实例

nacos注册中心作用-引自阿里云微服务课程.png
其他组件对比-引自阿里云微服务课程.png
数据模型-引自阿里云微服务课程.png

3、nacos注册中心原理
注册:
如下实例,注册中心存在一个类似于服务容器(serviceHolder)进行服务管理,两个提供者provider1/2提供服务1service1的实例instance1/2

注册实例-引自参考链接3.png
服务发现:
如下实例:左侧为订阅服务,本地维护一个服务列表,获取实例从本地获取,实例变更后从注册中心重新获取;右侧为直接从注册中心获取实例
服务发现实例-引自参考链接3.jpg

4、windows安装nacos
进入git下载地址下载nacos-server的zip包,本地解压,运行startup文件
报错如下:

image.png
解决: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注册中心
测试项目结构如下

测试项目结构.png

总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
image.png
通过页面即可进行接口级别流量控制,更深入的可以自行了解下

参考链接
1、dubbo注解
2、dubbo官方文档
3、官方文档
4、nacos注册与发现原理
5、nacos+springboot实现注册和发现
6、OpenFeign

上一篇下一篇

猜你喜欢

热点阅读