【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用

【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用

  • 总览
  • Nacos
    • 安装配置
    • Nacos注册中心
      • 服务多级存储模型
      • 负载均衡规则
      • 环境隔离
    • 配置管理
      • 配置拉取
      • 配置热更新
      • 多服务共享配置
  • Feign
    • 远程调用
    • 配置
    • 性能优化
    • Fegin使用
  • 统一网关Gateway
    • 搭建网关
      • 路由断言工厂(Route Predicate Factory)
      • 路由过滤器(GatewayFliter)
      • 全局过滤器(GlobalFilter)
    • 过滤器执行顺序
    • 跨域

本篇内容为学习笔记,学习链接为SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课

课程资料链接可在视频下方找到,此处不粘贴,而以下的代码都是资料中有的,只不过做为记录单独粘贴,做为学习使用的参考步骤。

总览

微服务中需要用到的内容:
服务网关、 服务集群、 注册中心、配置中心、消息队列,在和数据库连接过程中则用到分布式缓存、分布式搜索,还需要的额外服务为分布式日志、系统监控链路追踪。

在以上的完成后,使用Jenkins完成自动化编译的过程,由Docker打包成镜像。
在这里插入图片描述

各个内容中所需的技术:

  • 微服务注册发现
    • Eureka
    • Nacos
    • Consul
  • 服务远程调用
    • OpenFegin
    • Dubbo
  • 服务链路监控
    • Zipkin
    • Sleuth
  • 统一配置管理
    • SpringCloudConfig
    • Nacos
  • 统一网关路由
    • SpringCloudGateway
    • Zuul
  • 流量监控、降级、保护
    • Hystix
    • Sentinel

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

安装配置

Nacos文档链接
可以参考文档下载Nacos。

Windows启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

打开nacos -> bin目录中,使用cmd启动,输入以上命令,点击生成的地址即可进入Nacos页面。

使用
项目中:
父工程pom文件:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

子工程pom文件:

<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

客户端子配置文件(application.yml)中:

spring:
  application:
    name: userService
  cloud:
    nacos:
      server-addr: localhost:8848

Nacos注册中心

服务多级存储模型

一级为服务、二级为集群、三级为实例。

项目中采用配置:

    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: CQ #自定义集群名称

集群的设置可让某一个服务被集群内的服务请求优先访问。

负载均衡规则

NacosRule优先选择本地集群访问,本地集群内随机访问各个服务,本地集群无服务时进行跨集群访问:
在这里插入图片描述

在Nacos页面中,根据权重调整(0~1),权重越小,访问的概率越小:
在这里插入图片描述

环境隔离

通过namespace进行环境隔离:
1、nacos命名空间中创建
2、客户端服务中放入namespace生成的id号
3、重启服务,刷新nacos页面

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ #自定义集群名称
        namespace: c2a69c6f-995c-4cc0-a3e1-8f545ece5875

在这里插入图片描述
在这里插入图片描述
默认情况下服务为临时实例,心跳检测即为每隔一段时间,向注册中心发送内容证明还在服务。
而非临时实例的主动询问,询问结果为服务关闭时,注册中心会等待服务恢复。

临时实例修改为非临时实例:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ #自定义集群名称
        namespace: c2a69c6f-995c-4cc0-a3e1-8f545ece5875
        ephemeral: false #是否为临时实例

修改后在Nacos中心查看:

在这里插入图片描述

配置管理

获取配置原理:
在这里插入图片描述

添加配置,打开Nacos页面:

在这里插入图片描述

配置拉取

客户端依赖

<!--        nacos配置管理依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

resouces中新建bootstrp.yml文件,内容符合在nacos配置管理中的配置:

spring:
  application:
    name: userservice
  profiles:
    active: dev #环境
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        file-extension: yaml #文件后缀名

配置热更新

方法一:
通过@Value注解注入,@RefreshScope刷新

@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private PatternProperties patternProperties;

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

方法二:
注入后自动刷新,声明于类前

@ConfigurationProperties(prefix = "pattern")

多服务共享配置

多服务共享配置会根据读取优先级来进行配置,在此处主要介绍各个配置文件的优先级,以此来完成所想达到的共享配置目标。

微服务会从nacos读取的配置文件:

  • [服务名]-[spring.profile.active].yaml,环境配置
  • [服务名].yaml,默认配置,多环境共享

优先级:

[服务名]-[环境].yaml > [服务名].yaml > 本地配置

Feign

Feign为声明式Http客户端,帮助实现http请求发送,其中已经集成了ribbn,不需担心负载均衡。

远程调用

客户端依赖:

<!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

@EnableFeignClients,自动装配开关

@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
}

创建新类UserClient

@FeignClient(value = "userservice")
public interface UserClient {

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

OrderService

   @Autowired
    private UserClient userClient;
    
   public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

配置

在这里插入图片描述
日志配置

方法一:
配置文件中:

feign:
  client:
    config: 
      default:
        loggerLevel:FULL #看所有的日志

方法二:
在这里插入图片描述

性能优化

方法一:使用连接池HttClient或者OKHttp代替默认URLConnection
客户端依赖配置:

<!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

客户端配置:

feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数

方法二:日志级别尽量不使用basic或none

Fegin使用

在这里插入图片描述
在这里插入图片描述

统一网关Gateway

网关功能:

  • 身份认证和权限校验
  • 服务路由、负载均衡
  • 请求限流

在SpringCloud中网关的实现包括两种:

  • Gateway
  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

搭建网关

1、引入依赖

网关模块pom:

<!--nacos服务注册发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--网关gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

2、编写路由配置以及nacos地址

server:
  port: 10010
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos地址
    gateway:
      routes:
        - id: user-service # 路由标示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
      default-filters: #过滤器,处理请求或响应
        - AddRequestHeader=Truth,Itcast is freaking awesome!

路由断言工厂(Route Predicate Factory)

我们在配置文件中写的断言规则只是字符串,这些字符串会被 Predicate Factory读取并处理,转变为路由判断的条件。
例如Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的。

在这里插入图片描述

路由过滤器(GatewayFliter)

网关过滤器,对进入网关的请求和微服务返回的响应做处理。

作用:对路由的请求或响应做加工处理,比如添加请求头配置在路由下的过滤器。
在这里插入图片描述

spring:
  cloud:
    gateway:
      routes:
          filters: #给单独微服务添加过滤器,只对当前路由的请求生效
            - AddRequestHeader=Truth,Itcast is freaking awesome!

全局过滤器(GlobalFilter)

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

区别在于GatewayFilter通过配置定义,处理逻辑是固定的。

Globalfiter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。

在这里插入图片描述

@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2.获取参数中的 authorization 参数
        String auth = params.getFirst("authorization");
        // 3.判断参数值是否等于 admin
        if ("admin".equals(auth)) {
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        // 5.1.设置状态码,给用户合适的报错
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2.拦截请求
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {//设置过滤优先级,数值越大优先级越低
        return -1;
    }
}

在以上代码中,使用getOrder()方法设置过了优先级,除此之外,还可以在该类声明上使用@Order(-1)注解规定优先级。

过滤器执行顺序

所有过滤器都来自于GatewayFilter,因此得以进行排序。

路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增

在这里插入图片描述

跨域

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

通过CORS方案,让浏览器询问服务器,判断是否可以进行跨域。

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

扫雷小游戏制作教程:用HTML5和JavaScript打造经典游戏

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

ASP.NET-Server.UrlEncode

目录 背景: Server.UrlEncode作用: 1.URL 编码&#xff1a; 2.避免冲突&#xff1a; 3.安全性&#xff1a; 4.规范化&#xff1a; 实例说明: 不使用Server.UrlEncode 使用Server.UrlEncode 总结: 背景: Server.UrlEncode方法在ASP.NET中主要功能是对URL中的参数进行编…

使用点链云管家创建瑜伽约课小程序

点链云管家 点链云管家是由上海点链科技开发的门店管理系统&#xff0c;为线下门店商家提供一站式门店运营服务平台解决方案&#xff0c;适用于瑜伽健身、美业、新零售会员制电商、母婴店、宠物店、按摩养生、服装、美容、美甲、汽车服务、商超零售、餐饮、KTV娱乐、干洗等18个…

CodeFuse代码优化实战:Java日期格式化时如何正确表示年份?

代码优化&#xff0c;是 CodeFuse 插件推出的功能之一&#xff0c;它可以对选定代码段进行分析理解&#xff0c;提出优化和改进建议。还能直接基于改进建议形成代码补丁&#xff0c;帮助开发者写出更好的代码。 安装CodeFuse插件后&#xff0c;选中代码右键即可使用代码优化功能…

技术帖 | 飞凌嵌入式AM62x核心板SPI的详解与应用

SPI&#xff08;Serial Peripheral Interface&#xff09;通信总线以其高速、全双工、同步的特性而被广泛应用&#xff0c;它只需要四根线就能实现数据传输&#xff0c;有效地节约了芯片管脚的数量&#xff0c;同时为PCB布局带来了空间上的优化和便捷。正因为它简单易用的特点&…

csp模拟题(201604-2,俄罗斯方块模拟下坠)

题目 问题描述 俄罗斯方块是俄罗斯人阿列克谢帕基特诺夫发明的一款休闲游戏。   游戏在一个15行10列的方格图上进行&#xff0c;方格图上的每一个格子可能已经放置了方块&#xff0c;或者没有放置方块。每一轮&#xff0c;都会有一个新的由4个小方块组成的板块从方格图的上方…

NCV7356D1R2G接口集成芯片中文资料PDF数据手册参数引脚图规格书价格图片

产品概述&#xff1a; NCV7356 是一款用于单线数据链路的物理层器件&#xff0c;能够使用多种具碰撞分解的载波感测多重存取 (CSMA/CR) 协议运行&#xff0c;如博世控制器区域网络 (CAN) 2.0 版。此串行数据链路网络适用于不需要高速数据的应用&#xff0c;低速数据可在物理介…

基于RK3588+Codesys+Xenomai的ARM+LINUX实时硬件平台的软PLC解决方案

产品概述 公司推出基于瑞芯微RK3588架构的AI边缘计算主板&#xff0c;RK3588是新一代国产旗舰高性能64位八核处理器&#xff0c;采用8nm工艺&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6…

css超出部分显示省略号

目录 前言 一、CSS单行实现 二、CSS多行实现&#xff08;CSS3出的&#xff0c;兼容性需要注意&#xff09; 三、微信小程序超过2行出现省略号实现 四、JavaScript脚本实现 前言 CSS文本溢出就显示省略号&#xff0c;就是在样式中指定了盒子的宽度与高度,有可能出现某些内…

STM32基础--中断应用

本文章里面假设中断就是异常&#xff0c;不做区分。 异常类型 F103 在内核水平上搭载了一个异常响应系统&#xff0c;支持为数众多的系统异常和外部中断。其中系统异常有 8 个&#xff08;如果把 Reset 和 HardFault 也算上的话就是 10 个&#xff09;&#xff0c;外部中断有…

百度paddleocr GPU版部署

显卡&#xff1a;NVIDIA GeForce RTX 4070&#xff0c;Nvidia驱动程序版本&#xff1a;537.13 Nvidia驱动程序能支持的最高cuda版本&#xff1a;12.2.138 Python&#xff1a;python3.10.11。试过python3.12&#xff0c;安装paddleocr失败&#xff0c;找不到相关模块。 飞桨版本…

Java优先级队列(堆)

&#x1f435;本篇文章将对优先级队列&#xff08;堆&#xff09;的相关知识进行讲解 一、优先级队列 队列是一种“先入先出”的数据结构&#xff0c;但有时操作的数据带有优先级&#xff0c;需要优先处理&#xff0c;这时普通的队列就不能满足需求。比如&#xff1a;在排队取…

《JAVA与模式》之抽象工厂模式

系列文章目录 文章目录 系列文章目录前言一、使用简单工厂模式的解决方案二、引进抽象工厂模式三、抽象工厂模式结构四、抽象工厂模式的优缺点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

Github上哪些好用的安全工具1

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; URLFinder 一款快速提取网页信息的工具。该项目可以快速爬取网页上的 URL 地址、JS 文件里的 API 接口等信息&#xff0c;支持批量抓取…

推荐算法中经典排序算法GBDT+LR

文章目录 逻辑回归模型逻辑回归对于特征处理的优势逻辑回归处理特征的步骤 GBDT算法GBDTLR算法GBDT LR简单代码实现 逻辑回归模型 逻辑回归&#xff08;LR,Logistic Regression&#xff09;是一种传统机器学习分类模型&#xff0c;也是一种比较重要的非线性回归模型&#xff0…

LeetCode199题:二叉树的右视图(python3)

代码思路&#xff1a;深度优先搜索&#xff0c;每次总访问右子树&#xff0c;value_depth用dict存放&#xff0c;深度为索引&#xff0c;存放节点的值&#xff0c;stack从根节点[(root, 0)]开始&#xff0c;添加node和depth class Solution:def rightSideView(self, root: Opt…

深入理解 CSS——CSS进阶与实践(5w字高频面试题整理)

本文总结了CSS高频面试题&#xff0c;并搭配了演示动画进行CSS样式演示。介绍了关于如何理解盒模型&#xff0c;如何实现块级元素水平居中&#xff0c;如何实现两侧固定中间自适应的三栏布局、如何实现两栏布局&#xff0c;如何进行响应式设计&#xff0c;对BFC的理解&#xff…

04- 基于SpringAMQP封装RabbitMQ,消息队列的Work模型和发布订阅模型

SpringAMQP 概述 使用RabbitMQ原生API在代码中设置连接MQ的参数比较繁琐,我们更希望把连接参数写在yml文件中来简化开发 SpringAMQP是基于AMQP协议定义的一套API规范,将RabbitMQ封装成一套模板用来发送和接收消息 AMQP(Advanced Message Queuing Portocol)是用于在应用程序…

【危化品泄漏源定位】基于改进哈里斯鹰优化算法的危化品泄漏源定位算法 溯源定位算法【Matlab代码#63】

文章目录 【获取资源请见文章第7节&#xff1a;资源获取】1. 算法概述2. 原始哈里斯鹰算法&#xff08;HHO&#xff09;3. 改进哈里斯鹰算法&#xff08;IHHO&#xff09;3.1 动态自适应逃逸能量3.2 动态扰动策略 4. 构建源强和位置反算模型5. 部分代码展示6. 仿真结果展示7. 资…

牛-迈面试题----答案/类似题/知识点

来源在这里 来源在这里 1.Redis的优势 (1) 速度快&#xff0c;因为数据存在内存中&#xff0c;类似于HashMap&#xff0c;HashMap的优势就是查找和操作的时间复杂度都很低 (2)支持丰富数据类型&#xff0c;支持string&#xff0c;list&#xff0c;set&#xff0c;sorted set&…