java架构之路-(微服务专题)nacos集群精讲实战
上次回顾:
上次博客,我们主要说了微服务的发展历程和nacos集群单机的搭建,单机需要-m standalone启动,集群建议使用nginx做一下反向代理,自行保证mysql和ngxin的高可用。
本次定位:
一、nacos的内部概念
二、nacos的基本使用
三、为下次ribbon组件做准备
nacos的内部概念
上次我们搭建好了nacos集群,这次我们就在那个集群基础上来继续说,上次我们只说到了服务如何注册到我们的nacos,但是调用还没说,这次我们来说说各种调用吧(调用的负载均衡算法在ribbon去说)。
①.调用,我们先来一个最简单的调用,用户系统去调用订单系统,查询订单。

建立两个springboot项目,加入注册中心配置。配置上次博客说过了,这里就不再赘述了,在订单服务内写一个方法。
@RestController
public class OrderController { @GetMapping("/getOrderData")
public String getOrderData(){
return "获得订单服务的数据";
} @GetMapping("/getOrderData-B")
public String getOrderDataB(){
return "获得订单服务的数据B";
}
}
我就简单写一个了,能获取到下面的字符串也说明调用时可以的。
在用户服务中,编写config配置。
@Configuration
public class ClientConfig { @Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
开始调用啦
@RestController
public class UserController { @Autowired
private RestTemplate restTemplate; @Autowired
private DiscoveryClient discoveryClient; @GetMapping("/getOrder")
public String getOrderData(){
List<ServiceInstance> orderInfo = discoveryClient.getInstances("nacos-order");
if(null == orderInfo || orderInfo.isEmpty()) {
return "用户微服务没有对应的实例可用";
} String targetUri = orderInfo.get(0).getUri().toString(); String forObject = restTemplate.getForObject(targetUri + "/getOrderData", String.class);
System.out.println("forObject = " + forObject); return forObject;
}
}
就这样,最简单的调用也就可以实现了。(没有任何负载均衡算法,我直接get(0)了)。
②.namespace
这里我们来看看什么是namespace,如果我们开发,测试环境共用一个nacos,必定我们的接口地址也是不同,而且你在开发过程中,也是不建议随意配置测试环境的,这时我们就应该用namespace来隔离我们的空间。

打开我们的nacos的页面,点击命名空间,新建,输入信息即可。

我们再来看一下代码实现,如何实现隔离的。
首先在配置文件中添加namespace配置。namespace:命名空间ID
spring:
application:
name: nacos-order
cloud:
nacos:
discovery:
server-addr: 192.168.138.119:8848
namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
server:
port: 8888
订单服务的配置为开发环境,用户服务配置为测试环境的,我们来运行一下代码,理论上应该调用不通的,我们来看一下结果。

现实如此无法调用,也就做到了我们的隔离环境。如果不写namespace,默认是public命名空间。
③.group
group分组,也是用来隔离的,打个比方啊,加入我们的用户服务,订单服务,仓储服务和物流服务四个服务,订单服务中有一个接口叫getData,仓储服务中也有一个接口叫getData,我们的用户服务只想调用到我们的订单服务的getData,不想调用到仓储服务的getData,这时我们可以用group分组来隔离。

我们来看一下配置吧。只需要加入group:分组名称即可,nacos客户端不需要任何设置,这里需要注意的是你的父类项目依赖,2.1.0.RELEASE版本是没有group的,也无法设置group(反正我没找到什么好办法)。需要改配置为2.1.1.RELEASE
<!--spring cloud alibaba依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
spring:
application:
name: nacos-order
cloud:
nacos:
discovery:
server-addr: 192.168.138.119:8848
namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
group: pay
server:
port: 8888
④.还有一个概念是service服务集群,什么意思呢?先上个图。

就是什么呢,我们现在有两组集群,一个是北京的订单服务集群,一个是北京的用户服务集群,还有一个上海的订单服务集群,我们希望北京的用户集群,优先去调用北京的订单系统,上海的优先调用上海的集群服务。并不希望我们跨地区远程调用(如果组内实在没有服务了,也可以调用,但是优先考虑同一集群的)。配置文件如下所示
spring:
application:
name: nacos-order
cloud:
nacos:
discovery:
server-addr: 192.168.138.119:8848
namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
group: pay
cluster-name: BJ-cluster
server:
port: 8888
⑤.再就是版本了,也是我知道的最后一个了,比如我们要进行灰度发布了,我们有100台服务集群,但是这次新功能很重要,不能一次性全部更新,我们选择灰度发布,我们选出5台服务作为新版发布的,我们定义为V2,内部接口时不兼容的,所以我们只能要5台新用户服务去调用5台订单服务,原有的95台用户服务还是继续调用那95台订单服务,我们定义为V1。

我们来看一下代码配置
spring:
application:
name: nacos-order
cloud:
nacos: discovery:
server-addr: 192.168.138.119:8848
namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
group: namespace-one
cluster-name: BJ-cluster
metadata:
version: v1
server:
port: 8888
剧透一下,nacos是用map来进行隔离的,大致结构式Map<namespace,Map<group::serviceName,Service>>,也是我们为什么cluster-name和版本为什么做不到完全隔离,后面的源码博客会说详细说这个问题的。
总结:
这次我们主要说了nacos的使用,原理?原理还没说,等到我们的源码带着说一下吧,不难,就是一个心跳的问题。nacos要知道namespace、group、cluster-name、版本主要是用来做什么的,什么时候我们该选择什么。下次我们来说一下Ribbon,也就是我们服务直接调用的一个插件。


最进弄了一个公众号,小菜技术,欢迎大家的加入

java架构之路-(微服务专题)nacos集群精讲实战的更多相关文章
- 交付Dubbo微服务到kubernetes集群
1.基础架构 1.1.架构图 Zookeeper是Dubbo微服务集群的注册中心 它的高可用机制和k8s的etcd集群一致 java编写,需要jdk环境 1.2.节点规划 主机名 角色 ip hdss ...
- (转)实验文档2:实战交付一套dubbo微服务到kubernetes集群
基础架构 主机名 角色 ip HDSS7-11.host.com k8s代理节点1,zk1 10.4.7.11 HDSS7-12.host.com k8s代理节点2,zk2 10.4.7.12 HDS ...
- springcloud微服务基于redis集群的单点登录
springcloud微服务基于redis集群的单点登录 yls 2019-9-23 简介 本文介绍微服务架构中如何实现单点登录功能 创建三个服务: 操作redis集群的服务,用于多个服务之间共享数据 ...
- java架构之路-(Redis专题)Redis的主从、哨兵和集群
我们使用的redis,单机的绝对做不到高可用的,万一单机的redis宕机了,就没有备用的了,我们可以采用集群的方式来保证我们的高可用操作. 主从架构 大致就是这样的,一个主节点,两个从节点(一般两个就 ...
- java架构之路-(Redis专题)SpringBoot连接Redis超简单
上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构 如何配置我上次已 ...
- java架构之路-(Redis专题)聊聊大厂那些redis
上几次说了redis的主从,哨兵,集群配置,但是内部的选举一直没说,先来简单说一下选举吧. 集群选举 redis cluster节点间采取gossip协议进行通信,也就是说,在每一个节点间,无论主节点 ...
- java架构之路-(Redis专题)redis面试助力满分+
1.Redis支持的数据类型? 答:五种,在第一节redis相关的博客我就说过,String,Hash,List,Set,zSet,也就是我们的字符串,哈希,列表,集合,有序集合五种.结构图如下. 2 ...
- java架构之路-(MQ专题)RocketMQ从入坑到集群详解
这次我们来说说我们的RocketMQ的安装和参数配置,先来看一下我们RocketMQ的提出和应用场景吧. 早在2009年,阿里巴巴的淘宝第一次提出了双11购物狂欢节,但是在2009年,服务器无法承受到 ...
- java架构之路(MQ专题)kafka集群配置和简单使用
前面我们说了RabbitMQ和RocketMQ的安装和简单的使用,这次我们说一下Kafka的安装配置,后面我会用几个真实案例来说一下MQ的真实使用场景.天冷了,不愿意伸手,最近没怎么写博客了,还请见谅 ...
随机推荐
- C# 把文件夹下所有文件添加到集合中
private List<string> FindFile(string Path) { List<string> list=new List<string>(); ...
- Shell脚本传递带有空格的参数
在另一博文<Shell脚本实现DB2数据库表导出到文件>中实现了通过脚本实现将DB2数据库导出到文件,需要传入七个参数,最后一个是一个带有空格字符串,所以传入的时候有点问题,会自动识别空格 ...
- 解决RabbitMQ远程不能访问的问题
刚刚安装的RabbitMQ-Server-3.3.5,并且也已经开启了Web管理功能,但是现在存在一个问题: 出于安全的考虑,guest这个默认的用户只能通过http://localhost:1567 ...
- TensorFlow——批量归一化操作
批量归一化 在对神经网络的优化方法中,有一种使用十分广泛的方法——批量归一化,使得神经网络的识别准确度得到了极大的提升. 在网络的前向计算过程中,当输出的数据不再同一分布时,可能会使得loss的值非常 ...
- 一些常用查询SQL语句以及显示格式
1.查询当前年.月.周相关时间 1.1.查询当前年份 SELECT TO_CHAR(SYSDATE,'YYYY') AS YEAR FROM DUAL--查询当前年份 SELECT TO_CHAR(S ...
- 【LC_Lesson5】---求最长的公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- 【ARM】---关于ARM内核与架构的解释
本文摘自某论坛某位大神的一段回复,经典至极,copy来己用! 只要你玩过ARM内核的芯片,那么关于内核和架构,我想应该或多或少的困惑过你,看了下面的介绍,你应该会清楚很多! 好比你盖房子,刚开始因为水 ...
- 树形dp - 求树的直径
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...
- python的requests用法详解
Requests是一个Python语言写的http相关设置或者请求的一个库 安装:pip install Requests或者pip3 install requests 使用的时候要import re ...
- day6 相对定位:position:relative
相对定位:position:relative 特点:a.相对于自己原来位置的定位,以自己的左上角为基准. b.相对定位原来的位置仍然算位置,不会出现浮动现象. 以下为初始位置:(可以看出设置margi ...