• SpringCloud微服之Nacos的学习


    1:使用前提

    • 第一步:解压启动Nocos
      SpringCloudAlibaba 推出了一个名为 Nacos 的注册中心,在国外也有大量的使用。
      在这里插入图片描述

    startup.cmd -m standalone

    访问http://localhost:8848/nacos/
    在这里插入图片描述

    • 第二步:服务注册
      工程目录
      在这里插入图片描述

    在父工程中添加依赖

     <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.6.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在order-service user-service中添加依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    在userService中跟orderService中 添加配置

    spring:
      cloud:
        nacos:
          server-addr: 127.0.0.1:8848
    
    • 1
    • 2
    • 3
    • 4

    项目重新启动后,可以看到三个服务都被注册进了 Nacos
    在这里插入图片描述

    2:Nocos是注册中心

    a:已知

    orderService服务需要调用 userService服务 但是userService是有多个的

    b:oderService调用服务流程

    • order-service 如何得知 user-service 实例地址?
      user-service 服务实例启动后,将自己的信息注册到Nacos注册中心(Nacos服务端),叫做服务注册 eureka-server 保存服务名称到服务实例地址列表的映射关系 order-service 根据服务名称,拉取实例地址列表,这个叫服务发现或服务拉取 order-service
    • 如何从多个user-service 实例中选择具体的实例?
      order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用 order-service 如何得知某个
      user-service 实例是否依然健康,是不是已经宕机? user-service 会每隔一段时间(默认30秒)向
      nacos-server 发起请求,报告自己状态,称为心跳 当超过一定时间没有发送心跳时,nacos-server
      会认为微服务实例故障,将该实例从服务列表中剔除 order-service 拉取服务时,就能将故障实例排除了

    3:Nacos是配置中心

    a:使用背景

    微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
    图片: https://uploader.shimo.im/f/tmzV4LITzapqXYW3.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NTkwMDAzODksImZpbGVHVUlEIjoibThBWlYxUGVhV3U0SzBBYiIsImlhdCI6MTY1OTAwMDA4OSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2MzQ0MDYzN30.sXQf8NVYYEfSaWMEv6gXMBxmC6nPcmlVjZ3ONKVRnLw

    Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
    注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好。

    b:项目启动的时候读取配置文件的顺序

    未加入Nacos配置的 项目启动读取配置文件顺序
    在这里插入图片描述

    加入Nacos配置文件后的 项目启动读取配置文件的顺序
    在这里插入图片描述

    这样会引发一个问题,我们将Nacos服务的地址放到application.yml中 那么Nacos就无法根据地址去获取配置了
    加入bootstarap.yml
    图片: https://uploader.shimo.im/f/f1PHuAuEFafPfkqH.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NTkwMDAzODksImZpbGVHVUlEIjoibThBWlYxUGVhV3U0SzBBYiIsImlhdCI6MTY1OTAwMDA4OSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2MzQ0MDYzN30.sXQf8NVYYEfSaWMEv6gXMBxmC6nPcmlVjZ3ONKVRnLw

    c:关于Nacos配置中心的通俗理解

    那么实际使用的时候,我们的微服务是怎么从nacos上拿到配置文件的呢?我觉得本质是这样的:微服务在启动的时候,肯定会有个配置文件,这个配置文件中应该会说明 nacos的配置信息、命名空间、配置文件的名称等等信息,当有这些信息以后,相当于nacos集群和我们的服务之间就能实现网络互连,这样完全可以通过约定的协议从nacos上拿到对应的配置文件,拿到配置文件后再下载到本地上来,这样就实现了本地使用远程nacos上的配置文件了。而且如果要实现动态更新,比如在nacos上修改了这个配置文件的时候,也可以知道使用了该配置文件的服务是哪一些,然后通过网络下发通知说这个配置修改了,从而实现动态修改。不过我觉得这种动态更新应该只限制与一些普通配置文件,如果是一些数据库配置的话,毕竟微服务需要重新去连接一次数据库,和重启效果差不多是一样的了。
    原文链接:https://blog.csdn.net/qq_35463905/article/details/116525129
    (4):Nacos集群
    “因为当一个nacos服务部署在A服务器中,如果这台服务器挂了,那么就会出现各个模块都无法访问的了,所以将nacos部署在多个服务器中,搭建一个集群的模式,这样可以预防一台服务器挂了,所以的服务都会收到影响。”
    (5):Feign的远程调用
    a:使用背景
    Feign 是一个声明式的 http 客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现 http 请求的发送

    原来我们orderService调用UserService
    图片: https://uploader.shimo.im/f/iGzW1L9nm8BlAfkr.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NTkwMDAzODksImZpbGVHVUlEIjoibThBWlYxUGVhV3U0SzBBYiIsImlhdCI6MTY1OTAwMDA4OSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2MzQ0MDYzN30.sXQf8NVYYEfSaWMEv6gXMBxmC6nPcmlVjZ3ONKVRnLw

    显示出的问题:
    代码可读性差,参数不同一
    b:Feigin的使用流程
    引入依赖(在orderService中引入依赖)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    添加注解
    在order-service的启动类上添加注解
    图片: https://uploader.shimo.im/f/g1bmiXVpXEfQTdmt.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NTkwMDAzODksImZpbGVHVUlEIjoibThBWlYxUGVhV3U0SzBBYiIsImlhdCI6MTY1OTAwMDA4OSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2MzQ0MDYzN30.sXQf8NVYYEfSaWMEv6gXMBxmC6nPcmlVjZ3ONKVRnLw

    在orderService中添加一个接口

    package com.xn2001.order.client;
    import com.xn2001.order.pojo.User;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    @FeignClient("userservice")
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    @FeignClient(“userservice”):其中参数填写的是微服务名
    @GetMapping(“/user/{id}”):其中参数填写的是请求路径
    这个客户端主要是基于 SpringMVC 的注解 @GetMapping 来声明远程调用的信息
    Feign 可以帮助我们发送 http 请求,无需自己使用 RestTemplate 来发送了。
    测试

    @Autowired
    private UserClient userClient;
    public Order queryOrderAndUserById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // TODO: 2021/8/20 使用feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3. 将用户信息封装进订单
        order.setUser(user);
        // 4.返回
        return order;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    重学SpringBoot3-@Import注解的作用
    SpringBoot 代码混淆真香,再也不用担心反编译代码泄露...
    一个简单而优雅的C++线程池
    SpringMvc(一)-初识
    Tekton — 通过tekton-operator部署tekton组件
    【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动
    Git 行结束符:LF will be replaced by CRLF the next time Git touches it问题解决指南
    SpringBoot实现缓存预热方案
    Sui提供dApp Kit 助力快速构建React Apps和dApps
    前端补充19
  • 原文地址:https://blog.csdn.net/qq_48508278/article/details/126039809