前言
这个是nacos的架构图,nacos.io/en-us/docs/…
在1.x的 Nacos 版别中服务端只支持 http 协议,后来为了提高功能在2.x版别引进了谷歌的 grpc,grpc 是一款长衔接协议,极大的减少了 http 恳求频频的衔接创建和毁掉进程,能大幅度提高功能,节省资源。据官方测验,Nacos服务端 grpc 版别,相比 http 版别的功能提高了9倍以上。
grpc的端口会相对于server.port端口做的偏移,nacos的http端口为8848,则grpc的会运用8848+1000
,即9848作为和客户端的通讯端口,同时grpc会运用8848+1001
,即9849作为nacos集群间的数据同步端口。
http协议
这儿演示一下http的办法,看下nacos.io/zh-cn/docs/… 官网在这儿写了
我用postman操作下
看下服务端,现已注册上来了
咱们知道http是restful风格,那必定会有个controller来接收的,所以在代码里搜下这个途径
再恳求一下,打个断点,看到现已进来了,恳求参数以及回来的ok,证明咱们的猜测是正确的
再操作一下获取,也是能够拿到数据的,找源码代码的办法也是类似
gRPC协议
http协议能够经过postman来模拟,gRPC协议只能经过代码来模拟了,咱们看官网nacos.io/zh-cn/docs/… sdk页,注册用的是registerInstance办法。
我先新建一个项目,在pom文件里边引进nacos-client
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.4</version>
</dependency>
写如下一段测验代码
public static void main(String[] args) throws NacosException, IOException {
Properties properties = new Properties();
properties.setProperty("serverAddr","127.0.0.1:8848"); // 集群地址运用","离隔
NamingService naming = NamingFactory.createNamingService(properties);
//注册1
naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");
Instance instance = new Instance();
instance.setIp("55.55.55.55");
instance.setPort(9999);
instance.setHealthy(false);
instance.setWeight(2.0);
instance.setEnabled(true);
instance.setEphemeral(true);//AP(distro)、CP(Raft)
Map<String, String> instanceMeta = new HashMap<>();
instanceMeta.put("site", "et2");
instance.setMetadata(instanceMeta);
//注册2
naming.registerInstance("nacos.test.4", instance);
System.out.println("-----服务发现1-----");
System.out.println(naming.getAllInstances("nacos.test.3"));
System.out.println("-----服务发现2-----");
System.out.println(naming.getAllInstances("nacos.test.4"));
// 只要这个进程不停止,就意味着nacos client会不断地向nacos server发送心跳 时间距离
System.in.read();
}
执行一下,发现现已能够成功取到注册的信息了
再看下本地的nacos也现已成功注上来了,证明这段SDK是没问题的。
Spring Cloud集成
Spring Cloud集成让服务与注册变得更加简略,运用十分的简略,不必写很多代码,当然它的底层必定调的仍是nacos-client的sdk。
首要介绍一下这样的调用联系,接下来将按照这样的端口进行拜访演示。
创建一个Spring Boot项目,里边有user-client和coupon-client两个子项目
先对coupon-client引进nacos的pom依靠
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
细心的小伙伴会发现这儿没有写version的版别号,对,便是要不写,由于我要用版别办理,就比方spring cloud alibaba有Nacos,有Sentinel,有RocketMQ,有Seata,如果全都靠自己引,自己升级版别的话会出问题,各种不兼容,各种架包冲突,所以咱们用厂商自己提供的版别办理依靠。这儿的200.6和2021.0.4.0版别怎样挑选,在上篇文章 《从二进制和源码装置Nacos》 中介绍过了。
<dependencyManagement>
<dependencies>
<!-- 引进spring cloud 版别办理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引进spring cloud alibaba 版别办理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--引进spring cloud netflix 版别办理-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-dependencies</artifactId>
<version>3.1.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接着便是在application.yml文件中装备
server:
port: 8082
spring:
application:
# 服务称号
name: coupon
cloud:
nacos:
# nacos server的地址
server-addr: localhost:8848
发动一下,现已发动成功了
改写一下服务列表,也现已注册成功了
所以咱们发现用Spring Cloud的集成十分简略,两步即可完结,第一步是引用依靠,第二步是装备yml文件。上面画的联系图,一共要启三个coupon-client,所以需求再加两个,在idea里边配一下。
发动一下,发现也都注册上来了
接下来便是发动user-client,前面两步仍是相同的,仅仅这儿多写了一个controller类,要做调用的。
@RestController
@RequestMapping("/user")
public class UserController {
//自动安装
@Resource
private DiscoveryClient discoveryClient;
// 服务发现
@RequestMapping("/instances")
public List<ServiceInstance> instances() {
// 依据order称号获取到urls
return this.discoveryClient.getInstances("coupon");
}
}
发动一下,四个服务都现已注册上来了
用postman恳求一下,成功获取到了值。
范畴区分
在Nacos里有一些范畴区分,帮助咱们办理instance实例,先看下下面的联系图
Namespace
namespace命名空间,为了确保不同环境
装备完成隔离。默许在nacos中存在一个 public
命名空间,一切装备在没有指定命名空间时都在这个命名空间中获取装备,在实践开发时能够针对于不能环境创建不同的namespace空间。
新建一个命名空间dev
咱们在项目发动的时分能够指定namespace,这儿留意填的是命名空间ID,不是命名空间称号
咱们把8082发动一下,发现它现已在dev的命名空间下面了
对应着user-client在发动的时分namespace也要设置成dev,否则是拜访不到coupon的数据的,环境是隔离的,不能跨namespace拜访的。
Group
group是分组机制,它的纬度是完成服务注册信息或者DataId的分组办理机制,对于group的用法,没有固定的规矩,它也能够完成不同环境下的分组,也能够完成同一个使用下不同装备类型或者不同事务类型的分组。
官方主张是,group能够专注在事务层面
的数据分组。实践上在运用进程中,最重要的是提早定要统一的口径和规定,防止不同的项目团队混用导致后期保护紊乱的问题。
用法和Namespace类似,在yml文件中装备即可
Service
Service便是服务称号,比方user,coupon
Cluster
先来感受一下,我在yml文件里边一个配了上海,一个配了北京
到nacos上看下就很明晰了,一台8082机器在上海,一台8083机器在北京,集群便是一组机器,一般都是放在两个机房的,为了容灾,为了备份,也是便利办理,便是这个作用。
一切的范畴区分,一些中小型公司不必这么严格,比方有的公司就不必Group这一层,也不必集群也是能够的。有的公司直接不必Namespace层,直接用Group做dev、prod也是能够的。
元数据
同样也是先装备一下,感受一下
注册上来便是这样的
元数据便是元数据,想用的时分就能够用它,不想用的话知道下有这么个东西,如果哪天用上了呢。。
后记
上面一切的范畴区分在源码中便是双层map,map套map,即经过namespace+group+serviceName即可确定一个服务,后面在讲源码的时分再讲。
最终本文代码源码在:github.com/xuhaoj/spri… ,感谢大家观看,欢迎点赞,收藏,关注~