当前位置: 首页 > news >正文

【微服务学习笔记(一)】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: userServicecloud:nacos:server-addr: localhost:8848

Nacos注册中心

服务多级存储模型

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

项目中采用配置:

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

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

负载均衡规则

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

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

环境隔离

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

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

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

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

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ #自定义集群名称namespace: c2a69c6f-995c-4cc0-a3e1-8f545ece5875ephemeral: 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: userserviceprofiles:active: dev #环境cloud:nacos:server-addr: localhost:8848config:file-extension: yaml #文件后缀名

配置热更新

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

@RefreshScope
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate 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

   @Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.用Feign远程调用User user = userClient.findById(order.getUserId());// 3.封装user到Orderorder.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: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由标示,必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言,判断请求是否符合规则- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合- id: order-serviceuri: lb://orderservicepredicates:- 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 {@Overridepublic 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.判断参数值是否等于 adminif ("admin".equals(auth)) {// 4.是,放行return chain.filter(exchange);}// 5.否,拦截// 5.1.设置状态码,给用户合适的报错exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.拦截请求return exchange.getResponse().setComplete();}@Overridepublic 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 # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

相关文章:

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

【微服务学习笔记&#xff08;一&#xff09;】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂&…...

使用maven打生产环境可执行包

一、程序为什么要打包 程序打包的主要目的是将项目的源代码、依赖库和其他资源打包成一个可执行的文件或者部署包&#xff0c;方便程序的发布和部署。以下是一些打包程序的重要理由&#xff1a; 方便部署和分发&#xff1a;打包后的程序可以作为一个独立的实体&#xff0c;方便…...

springboot+ssm基于vue.js的客户关系Crm管理系统

系统包含两种角色&#xff1a;管理员、用户&#xff0c;主要功能如下。 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库…...

github 中的java前后端项目整合到本地运行

前言: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…...

分布式ID(7):Zookeeper实现分布式ID生成

1 原理 实现方式有两种,一种通过节点,一种通过节点的版本号 节点的特性持久顺序节点(PERSISTENT_SEQUENTIAL) 他的基本特性和持久节点是一致的,额外的特性表现在顺序性上。在ZooKeeper中,每个父节点都会为他的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序…...

钉钉小程序 - - - - - 如何通过一个链接打开小程序内的指定页面

方式1 钉钉小程序 scheme dingtalk://dingtalkclient/action/open_mini_app?miniAppId123&pagepages%2Findex%2Findex%3Fx%3D%25E4%25B8%25AD%25E6%2596%2587 方式2 https://applink.dingtalk.com/action/open_mini_app?type2&miniAppIdminiAppId&corpIdcorpId&…...

Java代码基础算法练习---2024.3.14

其实这就是从我学校的资源&#xff0c;都比较基础的算法题&#xff0c;先尽量每天都做1-2题&#xff0c;练手感。毕竟离我真正去尝试入职好的公司&#xff08;我指的就是中大厂&#xff0c;但是任重道远啊&#xff09;&#xff0c;仍有一定的时间&#xff0c;至少要等我升本之后…...

3月14日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 5.5G通信网络在海南投入商用&#xff0c;较5G提升10倍 &#x1f30d; 国务院批复同意&#xff0c;珠海港口岸将整合并扩大开放 &#x1f30b; 同有科技&#xff1a;正在研究新型磁电存储技术 &#x1f381; 美国折扣零售…...

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …...

C++等级3题

鸡兔同笼 #include<bits/stdc.h> using namespace std; void f(int n); int n; int main() {cin>>n;int x0;int ma-1;int mi1000;for(int i0;i<n;i){for(int j0;j<n;j){if(i*2j*4n){x1;mamax(ma,ij);mimin(mi,ij);}}}if(x1){cout<<mi<<" &…...

python中列表常用函数

列表list相关函数 列表相关函数 列表相关函数 汇总&#xff1a;. 列表: 1.list() 方法用于将序列&#xff08;元组&#xff0c;集合&#xff0c;字符串等&#xff09;转换为列表。 用法&#xff1a;list( seq ) #seq为序列&#xff1a;元组 集合 字符串等 2.列表定义&a…...

小程序连接蓝牙

小程序 蓝牙功能 1.授予蓝牙权限2.蓝牙初始化3.监听寻找新设备4.搜索新设备5.建立连接⭐⭐⭐⭐⭐⭐⭐6.监听蓝牙低功耗连接状态改变事件8.监听特征值变化9.发送数据 1.授予蓝牙权限 //1.蓝牙授权 const authBlue (callback, initApp) > {app initApp;//鉴定是否授权蓝牙w…...

基于Python的pygame库的五子棋游戏

安装pygame pip install pygame五子棋游戏代码 """五子棋之人机对战"""import sys import random import pygame from pygame.locals import * import pygame.gfxdraw from collections import namedtupleChessman namedtuple(Chessman, Name…...

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集&#xff08;万国码&#xff09; 3、乱码 4、Java中编码和解码的方法 字符集知识 字符&#xff08;Character&#xff09;&#xff1a;在计算机和电信技术中&#xff0c;一个字符是一个单位的字形、类字形单位或符号的基本信…...

TimescaleDB 开源时序数据库

文章目录 1.TimescaleDB介绍2.Hypertable 和 chunk3.Hypertable4.Hypertable操作 开源中间件 # TimescaleDBhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/timescale/timescale-summary/1.TimescaleDB介绍 TimescaleDB是基于PostgreSQL数据…...

如何保证Redis和数据库数据一致性

缓存可以提升性能&#xff0c;减轻数据库压力&#xff0c;在获取这部分好处的同时&#xff0c;它却带来了一些新的问题&#xff0c;缓存和数据库之间的数据一致性问题。 想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题 首先我们来看看一致性&#xff1a; 强一致性…...

css3常见选择器

使用工具 Visual Studio Code 1.CSS3基础选择器 1.1 标签选择器 1.2.1 标签选择器的语法 一个完整的HTML5页面是由很多不同的标签组成的&#xff0c;而标签选择器则决定标签应采用的CSS样式&#xff0c;语法如下:标签名{ 属性1&#xff1a;属性值1&#xff1b; 属性2&…...

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColor…...

2024年华为HCIA-DATACOM新增题库(H12-811)

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…...

离线安装数据库 mysql 5.7 linux

离线安装数据库 mysql 5.7 linux 方法一 参考链接Linux(Debian10.2)安装MySQL5.7.24环境 赋予文件执行权限chmod x 文件名 使用root用户sudo su解压文件tar xvf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz重命名mv mysql-5.7.42-linux-glibc2.12-x86_64 mysql将桌面的mys…...

2024-03-14学习笔记(YoloV9)

1.认知越高的人&#xff0c;越敬畏因果 摘要&#xff1a;本文讲述了认知越高的人越敬畏因果的道理。通过故事和名人案例&#xff0c;阐述了敬畏因果对于个人成长和成功的重要性。文章强调了遵循规律、不走捷径、正向思维的重要性&#xff0c;以及思维、行动、习惯、性格和命运…...

Cookie和Session介绍

1、Cookie的一些重要结论&#xff08;令牌&#xff0c;类似就诊卡记住我们的信息&#xff09;&#xff1a; &#xff08;1&#xff09;Cookie从哪里来&#xff1a;服务器返回给浏览器的&#xff0c;通常是首次访问/登录成功之后&#xff08;cookie是在header中传输&#xff09…...

OpenCV 将rgb图像转化成字符图像

将RGB图像转换成字符图像&#xff08;ASCII art&#xff09;通常涉及到灰度化、降采样、映射字符等一系列步骤。以下是一个简化的OpenCVC实现示例&#xff1a; #include <opencv2/opencv.hpp> #include <iostream> #include <string>// 字符映射表&#xff…...

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…...

软件实际应用实例,物流打印用什么软件,佳易王物流货运快运单打印查询管理系统软件,可以在已经印刷好的单子上打印,也可直接打印

软件实际应用实例&#xff0c;物流打印用什么软件&#xff0c;佳易王物流货运快运单打印查询管理系统软件&#xff0c;可以在已经印刷好的单子上打印&#xff0c;也可直接打印 一、前言 以下软件教程以 佳易王物流单打印查询管理系统软件V17.0为例说明 软件文件下载可以点击…...

第六届上海国际垃圾焚烧发电展将于12月11-13日上海举办

第六届上海国际垃圾焚烧发电暨固废处理技术展览会 2024年12月11-13日 上海新国际博览中心 主办单位&#xff1a;中华环保联合会 废弃物发电专委会 支持单位&#xff1a;垃圾焚烧技术与装备国家工程实验室 承办单位&#xff1a;上海怡涵展览服务有限公司 展会介绍&#xff1a…...

pytorch(十)循环神经网络

文章目录 卷积神经网络与循环神经网络的区别RNN cell结构构造RNN例子 seq2seq 卷积神经网络与循环神经网络的区别 卷积神经网络&#xff1a;在卷积神经网络中&#xff0c;全连接层的参数占比是最多的。 卷积神经网络主要用语处理图像、语音等空间数据&#xff0c;它的特点是局部…...

【黑马程序员】Python文件、异常、模块、包

文章目录 文件操作文件编码什么是编码为什么要使用编码 文件的读取openmodel常用的三种基础访问模式读操作相关方法 文件的写入注意代码示例 异常定义异常捕获捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常的传递 python 模块定义模块的导入import模块名from …...

导入fetch_california_housing 加州房价数据集报错解决(HTTPError: HTTP Error 403: Forbidden)

报错 HTTPError Traceback (most recent call last) Cell In[3], line 52 from sklearn.datasets import fetch_california_housing3 from sklearn.model_selection import train_test_split ----> 5 X, Y fetch_california_housing(retu…...