• 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,也就是我们服务直接调用的一个插件。

     

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

     

  • 相关阅读:
    《闲扯Redis十》Redis 跳跃表的结构实现
    《闲扯Redis九》Redis五种数据类型之Set型
    《闲扯Redis八》Redis字典的哈希表执行Rehash过程分析
    《闲扯Redis七》Redis字典结构的底层实现
    《闲扯Redis六》Redis五种数据类型之Hash型
    js定时器为什么是不精确的
    单页面应用的优缺点(SPA)
    怎么减少http请求次数
    animation 和 transition 的区别
    akka-typed(9)
  • 原文地址:https://www.cnblogs.com/cxiaocai/p/12329927.html
Copyright © 2020-2023  润新知