Dubbo服务发现

工具:nacos
黑马程序员提供教学视频以及资料

Dubbo服务发现


Dubbo是阿里巴巴公司开源的RPC框架,在国内有着非常大的用户群体,但是期为服务开发组件对SpringCloud来说并不是那么完善。
SpringCloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接口,Dubbo协议相比RESTful协议速度更快。
RPC:RPC是远程过程调用(Remote Procedure Call)的缩写形式,调用RPC远程方法就像调用本地方法一样,非常方便。
Dubbo服务框架
下图是微服务采用Dubbo协议的系统框架图:
在这里插入图片描述

组件说明:
1、 客户端:前端获外部系统
2、 API网关:系统唯一入口,路由转发
3、 Application-1:应用1,前端提供Http接口,接收用户的交互请求,通过对外暴露restful服务端口提供服务
4、 Service-1:微服务1,提供业务逻辑处理服务,以dubbo协议对用用层提供服务
5、 Service-2:微服务2,提供业务逻辑处理服务,以dubbo协议对用用层提供服务
交互流程:
1、 网关负责客户端请求的统一入口,路由转发,前端通过网关请求后端服务。
2、 网关收到前端前请求,转发请求给应用。
3、 应用接收前端请求,调用微服务进行业务逻辑处理
4、 微服务为应用提供业务逻辑处理的支撑,为应用提供Dubbo协议接口
优势分析:
此框架同时提供RESTful和Dubbo接口服务,应用层对前端提供RESTful接口,RESTful是互联网通用的轻量级交互协议,方便前端接入系统;微服务层向应用层提供Dubbo接口,Dubbo接口基于RPC通信协议速度更快。
阿里开源的nacos集服务发现和配置中心于一身,支持restful及dubbo服务的注册。
测试环境
父工程:仍然是nacos-discovery
Application1:使用nacos-restful-consumer
Service1微服务:需要新建
Service2微服务:需要新建
Api网关
Service2微服务
Service2对外暴露dubbo协议的接口,考虑远程接口可能会被其它多个服务调用,这里将service2的接口单独抽取出api工程,service2微服务工程的结构如下:
在这里插入图片描述

1、Service2-api:存放接口,独立成一个工程方便被其它服务工程依赖。
2、Service2-server:存放接口实现,即dubbo服务的实现部分
定义service2-api
1、创建service2工程
在这里插入图片描述
创建之后,发现创建这个Directory跟上面的不一样,没有像摄像头那样的空圆圈的点
在这里插入图片描述

File—>Project Structure
在这里插入图片描述

去掉右边红色框框里面的两个选项即可
在这里插入图片描述

在service2-api的main方法下建包,com.nacos.microservice.service2.api,在这下面创建一个Service2Api接口。
Service2Api

package com.nacos.microservice.service2.api;
public interface Service2Api {
    public String dubboService2();
}

service2-server的main方法下创建包,com.nacos.microservice.service2,然后在这下面创建一个实现类, Service2Bootstrap启动类
Service2Bootstrap

package com.nacos.microservice.service2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//启动类
@SpringBootApplication
public class Service2Bootstrap {
    public static void main(String[] args) {
        SpringApplication.run(Service2Bootstrap.class,args);
    }
}

但是会报错,报错原因就是nacos-discovery父工程pom文件中引入的版本号跟idea中的版本号不一致,目前就是找到的一种解决方法就是把图中红圈中的版本改成与新建springboot时看到的版本号一致就行。父工程nacos-discovery下的pom.xml
在这里插入图片描述

这个版本号可以在新建一个springboot的项目的时候看到,也就是这个地方:
在这里插入图片描述

service2-server下的pom文件。由于接口跟实现类不在一个工种内,所以得在service2-server的pom.xml下面添加service2-api的依赖
pom.xml

<dependencies>
<!--dubbo-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.nacos</groupId>
    <artifactId>service2-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

service2-server的main方法下创建包,com.nacos.microservice.service2.server,然后在这下面创建一个实现类,Service2ApiImpl类
Service2ApImpl

package com.nacos.microservice.service2.server;
import com.nacos.microservice.service2.api.Service2Api;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService//如何暴露成dubbo服务,即在pom文件中引入dubbo服务
public class Service2ApiImpl implements Service2Api {
    @Override
    public String dubboService2() {
        return "dubboService2";//return一个字符串
     }
}

解释:如果用的是@Service就会有个橙色的颜色出现,原因就是@Service注解显示已被弃用,根据源码的注释发现,被弃用的注解@Service由@DubboService替代。
在这里插入图片描述

service2-server的resource中添加bootstrap.yml配置文件
bootstrap.yml

server:
  port: 56040 #启动端口 命令行注入
spring:
  application:
    name: dubbo-service2
  main:
    allow-bean-definition-overriding: true # Spring Boot 2.1需要设定
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.nacos.microservice.service2.service
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口
    port: 20891
  registry:
    address: nacos://127.0.0.1:8848
  application:
    qos-enable: false #dubbo运维服务是否开启
  consumer:
    check: false  #启动时就否检查依赖的服务

首先确保nacos是启动着的,然后启动Service2Bootstrap,启动成功后观察nacos服务列表。
在这里插入图片描述

结构图:
在这里插入图片描述

实现application1调用service2
Nacos-restful-consumer的pom.xml文件添加以下依赖
pom.xml

<dependency>
    <groupId>com.nacos</groupId>
    <artifactId>service2-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

实现远程调用
在Nacos-restful-consumer的controller下
RestConsumerController
在最后面

//把service2Api这个接口注入进来,生成这个接口的代理对象
//注入之后可以实现整个远程调用
//import org.apache.dubbo.config.annotation.DubboReference;
@DubboReference
Service2Api service2Api; 
@GetMapping(value = "/service2")
public String service2(){
    //远程调用 service2Api
    String providerResult = service2Api.dubboService2();
    return "Consumer dubbo invoke |" + providerResult;
}

重启Service2Bootstrap,请求http://127.0.0.1:56020/service2
在这里插入图片描述
实现service1,即对外暴露端口并且调用service2
创建service1工程。这个跟service2结构一致。
在这里插入图片描述

service1-server下面
pom.xml

<dependencies>
    <!--基于service1接口,所以把service1导进来-->
    <dependency>
        <groupId>com.nacos</groupId>
        <artifactId>service1-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--还需要调用service2-->
    <dependency>
        <groupId>com.nacos</groupId>
        <artifactId>service2-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--暴露dubbo服务-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
</dependencies>

Service1ApiImpl
在这里插入图片描述
Service1Bootstrap
在这里插入图片描述

bookstrap.yml
在这里插入图片描述
Service1-api下的
Service1Api
在这里插入图片描述

启动service1的启动类,确保nacos是打开的,观察服务列表中的变化
在这里插入图片描述

实现application调用service
Nacos-restful-consumer的pom.xml文件添加以下依赖
pom.xml

<!--实现谁就调用谁-->
<dependency>
    <groupId>com.nacos</groupId>
    <artifactId>service1-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

RestConsumerController
在这里插入图片描述

重启SpringRestConsumerBookstrap。首先调用service1,service1调用service2。
访问http://127.0.0.1:56020/service3

服务发现数据模型

1、 Namespace隔离设计
命名空间(namespace)用于进行租户粒度的隔离,Namespace的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

  • 从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespace,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不同的环境,那么使用一套nacos集群可以分别建以下三个不同的namespace。如图:
    在这里插入图片描述
  • 从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的namespace,每个租户(用户)的配置数以及注册的服务数据都会归属到自己的namespace下,以此来实现多租户间的数据隔离。例如,超级管理员分配了三分租户,分别为张三、李四和王五。分配好之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如图:
    在这里插入图片描述

2、 数据模型
Nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。
在这里插入图片描述

Nacos服务发现的数据模型:

服务:对外提供的软件功能,通过网络访问预定义的接口
服务名:服务提供的标识,通过该标识可以唯一确定要访问的服务。
实例:提供一个或者多个服务的具有可访问网络地址(IP:Port)的进程,启动一个服务,就产生了一个服务实例
元信息:Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种定义标签(label),从作用范围来看,分为服务级别的元信息及实例的元信息。
集群:服务实例的集合,服务实例组成一个默认集群,集群可以被进一步按需求划分,划分的单位可以是虚拟机群,相同集群下的实例才能相互感知。
通过数据模型可知:
应通过namespace(命名空间),service(服务),cluster(集群(DEFAULT))的配置,描述了该服务向哪个环境(如开发环境)的哪个集群注册实例。
例子:
指定namespace的id:8dd2610c-e8c5-4f41-a848-7eee932c218e(根据自己环境设置namespace的id)
指定集群名称:DEFAULT表示集群,可不填写
配置流程:运行nacos–>找到命名空间–>点击新建命名空间–>写上命名空间名和描述–>确定
在这里插入图片描述

然后可以看到命名空间的id
在这里插入图片描述
复制,到consumer、service1和service2上的yml配置文件中配置上去
在这里插入图片描述
启动service2–>service1–>consumer, 访问:http://127.0.0.1:56020/service3

Note:集群作为实例的隔离,相同集群的实例才能相互感知。
Note:namespace、cluster-name若不填写都将采取默认值,namespace的默认值是public命名空间,cluster-name的默认值为DEFAULT集群

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值