Nacos微服务笔记

news2024/11/30 10:35:36

Nacos安装

Nacos 的 Github(Tags · alibaba/nacos · GitHub)下载我们所需的 Nacos 版本,可以选择 windows 或者 Linux。 进入官网,选择合适版本,tar.gz为linux版本,zip为windows版本。下载并解压 nacos-server-1.4.3.zip,解压完成后进入 /bin 目录,运行startup.cmd脚本。然后访问管理平台:

nacos注册服务中心管理可以通过管理平台查看和配置。启动后访问如下:

管理平台:http://localhost:8848/nacos

用户名:nacos

密 码:nacos

注册中心

这里对架构CAP进行简单介绍

CAP:C 一致性 A 可用性 P 分区容错性

以下是各个注册中心的CAP原理介绍

(1)Zookeeper 和 Consul 遵循 CP 原则,保证了强一致性和分区容错性,放弃可用性,在分布式环境中,如果涉及数据存储的场景,数据一致性应该是首先被保证的,但对于服务发现来说,可用性才是最核心的,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的,消费者拿到不正确的服务实例信息后尝试消费一下,也胜过因为无法获取实例信息而不去消费而导致系统异常
(2)Eureka 遵循 AP 原则,保证可用性,放弃数据一致性,基本能满足注册中心所需的核心功能,但 Eureka 2.x 版本已停止开发,并且宣布如果继续使用的话,风险自负。
(3)Nacos 同时支持 AP 与 CP,默认是 AP,同时功能更丰富,与 SpringCloud Alibaba 的兼容性更好,使用更简单灵活,可以满足更多的业务场景,且支持 K8S 的集成。

在进行Springcloud项目时版本依赖一定要合适,由于本人在一开始搭建项目的时候由于版本问题折腾了一段时间,在此把版本依赖进行记录。

推荐组件版本

导入依赖

  <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

application.yml文件配置

spring: 
 application:
    name: user

  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: SH//集群名字

负载均衡

导入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

负载均衡配置文件

@Configuration
public class RestTemplateConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

业务使用

@RestController
@RefreshScope
public class UserController {
    @Autowired
    OrdersMapper ordersMapper;
    String url="http://user:9201/user/";

    @Value("${pattern.dateformat}")
    private String dateformat;

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    Feign feign;

    @GetMapping("/order/{id}")
    public Orders orders(@PathVariable("id") Long id, @RequestHeader(value = "token",required = false) String token){
        System.out.println(token);
        DateFormat df=new SimpleDateFormat(dateformat);
        System.out.println(df.format(new Date()));
        Orders orders = ordersMapper.selectById(id);
        User forObject = restTemplate.getForObject(url + orders.getUserId(), User.class);
       //User user = feign.findbyId(orders.getUserId());
        orders.setUser(user);
        return orders;
    }


}

配置nacos访问进行负载均衡的时候 优先访问集群内部的服务,在访问集群内部的服务实例的时候采用随机方式,配置代码如下,如果不设计以下代码,在访问的时候负载均衡默认采用轮询的方式。

user://要做配置的微服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

实际部署中有这样的场景,服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。可以在nacos中心配置实例权重值。

Nacos配置管理

导入依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

在nacos注册中心配置列表新建provider-dev.yaml文件,微服务名-部署环境.文件类型

在resources中新建bootstrap.yml

spring:
  application:
    name: provider
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        file-extension: yaml
      discovery:
        cluster-name: BJ

配置完成后就可以正常的使用了。

配置热更新在业务组件上加上@RefreshScope注解就可以了

多环境配置共享,微服务启动时会从nacos中读取多个配置文件,[spring.apllication.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件。

多种配置优先级:服务名-profile.yaml>服务名.yaml>本地配置

Feign

导入依赖

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

编写Feign客户端

@FeignClient("user")
public interface Feign {

    @GetMapping("/user/{id}")
    User findbyId(@PathVariable("id") Long id);
}

Gateway

新建一个moudle

导入依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

编写路由配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: pro-vider
          uri: lb://provider
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=token,mytoken //部分
      default-filters:
         - AddRequestHeader=token,mytoken //全局

另一种全局过滤器

@Component
@Order(-1)//越小优先级越高
public class Filter implements GlobalFilter {
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        String author = queryParams.getFirst("author");
        if("admin".equals(author)){
           return chain.filter(exchange);
        }
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter,请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。

由于浏览器不能执行其他网站的脚本,Ajax请求发送不出去。Gateway跨域配置代码如下

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: pro-vider
          uri: lb://provider
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=token,mytoken
      globalcors:  #全局的跨域处理
        add-to-simple-url-handler-mapping: true #解决options请求拦截的问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: #允许哪些网站的跨域请求
              - "http://localhost:10010"
              - "http://www.baidu.com"
            allowedMethods: #允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*"  #允许在请求中携带的头信息
            allowCredentials: true  #是否允许携带cookie
            maxAge: 240000   #这次跨域的有效期,单位ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++进阶】一、继承(总)

目录 一、继承的概念及定义 1.1 继承概念 1.2 继承定义 1.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 7.1 继承的分类 7.2 菱形虚拟…

【SAP Abap】X-DOC:SE11 - 创建配置表并分配事务码

SE11 - 创建配置表并分配事务码1、创建自定义表2、创建表维护功能3、功能验证4、设置事务码5、带出字段默认值&#xff08;1&#xff09;方法一&#xff1a;表维护事件&#xff08;2&#xff09;方法二&#xff1a;屏幕事件1、创建自定义表 SE11&#xff0c;创建自定义表&…

结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略

结构体的三种定义方法 一、单独定义&#xff1a; 先定义结构体类型&#xff0c;再定义变量   定义结构体的格式如下&#xff1a;    struct 结构体名 {    若干数据项&#xff1b;    } &#xff1b;   其中&#xff0c;struct为关键字&#xff1b; 结构体名是用户定…

golang 入门教程:迷你 Twitter 后端

请记住&#xff0c;这个项目主要是为了稍微熟悉下Golang&#xff0c;您可以复制架构&#xff0c;但该项目缺少适当的 ORM&#xff0c;没有适当的身份验证或授权&#xff0c;我完全无视中间件&#xff0c;也没有测试。 我将在其自己的部分中讨论所有这些问题&#xff0c;但重要的…

利用NGROK将本地网站发布为一个公开网站

一般与第三方服务集成时&#xff0c;需要提供https的回调URL&#xff0c;本地开发阶段可以利用NGROK将本地网站发布为公开的https网站。https://ngrok.com/downloadWindow下载地址&#xff1a;https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-windows-amd64.zip以Window…

echarts问题汇总

因为工作中经常使用echarts&#xff0c;做数据可视化相关需求&#xff0c;需要实现各种各样图表的需求。 有遇到过很多问题&#xff0c;一些网上不太好搜索到解决方案的&#xff0c;一直想总结一下解决过程。方便自己查阅&#xff0c;也方便别人参考。 一&#xff1a;echarts…

【C++】set/multiset、map/multimap的使用

目录 一、关联式容器 二、set的介绍 1、接口count与容器multiset 2、接口lower_bound和upper_bound 三、map的介绍 1、接口insert 2、接口insert和operator[]和at 3、容器multimap 四、map和set相关OJ 1、前K个高频单词 2、两个数组的交集 一、关联式容器 vector、…

【LeetCode】环形链表 II [M](链表)

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链…

Python网络爬虫 学习笔记(1)requests库爬虫

文章目录Requests库网络爬虫requests.get()的基本使用框架requests.get()的带异常处理使用框架&#xff08;重点&#xff09;requests库的其他方法和HTTP协议&#xff08;非重点&#xff09;requests.get()的可选参数网络爬虫引发的问题&#xff08;非重点&#xff09;常见问题…

【C/C++】Windows下VS创建Linux项目

如果不想在Linux下用vim编写代码&#xff0c;可以在Windows下使用VS远程连接Linux&#xff08;Linux下是不支持安装使用VS的&#xff09;&#xff0c;将VS上编写的代码通过 SSH协议 推送到Linux下&#xff0c;注意文件编写是在Windows上进行的&#xff0c;编译是在Linux下进行的…

【Hello Linux】Linux工具介绍 (make/makefile git)

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的常用工具make/makefile git Linux项目自动化构建工具 – make/Makefile 背景 会不会写Makefile 从侧面说明了一个人是否具…

Spring Cloud微服务网关Gateway组件

目录 网关简介 什么是Spring Cloud Gateway Spring Cloud Gateway 功能特征 核心概念 工作原理 Spring Cloud Gateway快速开始 环境搭建 集成Nacos 路由断言工厂&#xff08;Route Predicate Factories&#xff09;配置 自定义路由断言工厂 过滤器工厂&#xff08; …

window 配置深度学习环境GPU

CUDA 11.6 CUDNN Anaconda pytorch 参考网址&#xff1a;https://zhuanlan.zhihu.com/p/460806048 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 电脑信息 RTX 2060 GPU0 1. CUDA 11.6 1.1 确认信息 C:\Users\thzn>nvidia-smi &#xff08;CUDA Versi…

秒杀项目之消息推送

目录一、创建消费者二、创建订单链路配置2.1 定义RabbitMQ配置类2.2 创建RabbitmqOrderConfig配置类三、如何实现RabbitMQ重复投递机制3.1 开启发送者消息确认模式3.2 消费发送确认3.2.1 创建ConfirmCallBack确认模式3.2.2 创建ReturnCallBack退回模式3.3 创建生产者3.4 创建消…

金三银四必看软件测试面试题,上百家公司面试都是这些套路

自我介绍说一下测试用例嗯&#xff0c;做测试&#xff0c;好多时间是在琢磨分析测试用例怎么去写&#xff0c;这个每个公司规范可能不太一样&#xff0c;但是大致思想是一致的。都是想要通过测试用例&#xff0c;把每一个分析到位&#xff0c;进行测试。就拿我上家公司来说吧&a…

数据库(2)--加深对统计查询的理解,熟练使用聚合函数

一、内容要求 利用sql建立学生信息数据库&#xff0c;并定义以下基本表&#xff1a; 学生&#xff08;学号&#xff0c;年龄&#xff0c;性别&#xff0c;系号&#xff09; 课程&#xff08;课号&#xff0c;课名&#xff0c;学分&#xff0c;学时&#xff09; 选课&#xff0…

融云入围「2022 云办公平台 TOP50」,进入「中国协同办公产业图谱」

2 月 10 日&#xff0c;中国科学院旗下《互联网周刊》颁布“2022 云办公平台 TOP50”&#xff0c;融云荣登榜单。 2 月 13 日&#xff0c;艾瑞咨询发布《2023 年中国协同办公行业研究报告》&#xff08;下简称《报告》&#xff09;&#xff0c;对协同办公行业的供需动态和迭代方…

黑马】后台管理-项目优化和上线

一。项目优化优化1&#xff0c;加载进度条显示安装一个运行依赖&#xff0c;nprogress然后导包&#xff0c;调用对象展示和隐藏在main中基于拦截器实现展示进度条和隐藏进度条的效果如果触发请求拦截器&#xff0c;证明发起请求&#xff0c;希望展示进度条&#xff0c;如果触发…

消防应急照明和疏散指示系统——集中控制型系统的设计与应用

安科瑞 李亚俊 V:Acrel8757 摘要&#xff1a;伴随着建筑领域的良好发展&#xff0c;建筑工程建设越来越复杂&#xff0c;相应的消防配套设施也越来越先进&#xff0c;火灾发生时&#xff0c;人在燃烧产生的噪音和烟气中会产生恐惧、不安等不良的心理状态&#xff0c;进而影响他…

NLP篇章2:理解Transformer

Transformer编码&#xff0c;解码大的结构的理解 编码部分&#xff0c;每一个的小编码器的输入是前一个小编码器的输出&#xff0c; 而每一个小解码器的输入不光是它的前一个解码器的输出&#xff0c;还包括了整个编码部分的输出。 self-attention 自注意力机制 顾名思义就是…