02Nacos和Feign及Gateway配置

news2024/11/19 17:22:22

一、Nacos配置管理

1.统一配置管理

配置更改热更新

 ①在Nacos中添加配置信息:

 ②在弹出表单中填写配置信息:

 2.配置获取的步骤如下

 配置文件bootstrap.yml的优先级比application.yml优先级高。把nacos地址放入bootstrap.yml。

①在userservice中引入Nacos的配置管理客户端依赖:

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

②在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:

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

在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件。

③在user-service中将pattern.dateformat这个属性注入到UserController中做测试

 ④访问http://localhost:8081/user/now获取时间对应格式,配置生效

 

3.配置自动更新

Nacos配置更新,无需重启微服务就可以配置更新。

方式一:在@Value注入的变量所在类上添加注解@RefreshScope

方式二:

使用@ConfigurationProperties注解

①创建一个配置类PatternProperties

@Component
@Data
@ConfigurationProperties(prefix = "pattern") // 跟配置文件的顶级名一致
public class PatternProperties {
   private String dateformat;
}

②在需要用的controller进行注入

 

总结:

  • 通过@Value注解注入,结合@RefreshScope来刷新
  • 通过@ConfigurationProperties注入,自动刷新

注意事项:

  • 不是所有的配置都适合放到配置中心,维护起来比较麻烦
  • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

4.多服务共享配置

启动的时候从nacos读取多个配置文件优先级

userservice-dev.yaml>userservice.yaml>application.yml

无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件。

总结:

 

 二、http客户端Feign

1.RestTemplate方式存在的问题

RestTemplate远程调用的代码

String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

①代码可读性差,编程体验不统一

②参数复杂时URL难以维护

2.定义和使用Feign客户端

①在orderservice导入依赖

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

②在启动类添加注解开启Feign功能@EnableFeignClients

 ③编写Feign客户端接口

@FeignClient("userservice") //提供者名
public interface UserClient {
    @GetMapping("/user/{id}") 
    User findById(@PathVariable("id") Long id);
}

④使用Feign客户端代替RestTemplate

总结:

  • 引入依赖
  • 添加@EnableFeignClients注解
  • 编写FeignClient接口
  • 使用FeignClient中定义的方法代替RestTemplate

3.配置Feign日志的两种方式

feign.Logger.Level 修改日志级别 包含四种不同的级别:NONE、BASIC、HEADERS、FULL

方式一

配置文件方式

①全局生效

 ②局部生效

方式二

①声明一个Bean

public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; 
    }
}

②全局配置,则把它放到@EnableFeignClients这个注解中

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

③局部配置,则把它放到@FeignClient这个注解

@FeignClient(value="userservice",configuration = FeignClientConfiguration.class)

总结

方式一是配置文件,feign.client.config.xxx.loggerLevel

  • 如果xxx是default则代表全局
  • 如果xxx是服务名称,例如userservice则代表某服务

方式二是java代码配置Logger.Level这个Bean

  • 如果在@EnableFeignClients注解声明则代表全局
  • 如果在@FeignClient注解中声明则代表某服务

4.Feign性能优化

①Feign连接池的设置

引入httpClient依赖

 配置连接池

优化总结

  • 日志级别尽量用basic
  • 使用HttpClient或OKHttp代替URLConnection

        引入feign-httpClient依赖

        配置文件开启httpClient功能,设置连接池参数

5.Feign的最佳实践

方式一(继承):给消费者的FeignClient和提供者controller定义统一的父接口。然后实现接口

缺点

  • 服务紧耦合
  • 父接口参数列表中的映射不会被继承

方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用

6.抽取FeignClient

  • 首先创建一个module,命名为feign-api,然后引入feign的starter依赖

  • 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

  • 在order-service中引入feign-api的依赖

  • 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
  • 重启测试

注意:

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:

方式一:指定FeignClient所在包

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二:指定FeignClient字节码

@EnableFeignClients(clients = {UserClient.class})

三、统一网关Gateway

1.为什么需要网关

①对用户请求做身份验证、权限校验。

②将用户请求路由到微服务,实现负载均衡

③用户请求做限流

2.网关技术的实现

SpringCloud实现网关的方式

①gateway

②zuul

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

3.搭建网关服务

①创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:

<!--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>

②编写路由配置及nacos地址

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes:
        - id: user-service #路由标识,唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 判断请求的规则
            - Path=/user/** # 路径的规则
        - id: order-service #路由标识,唯一
          uri: lb://orderservice # 路由的目标地址
          predicates: # 判断请求的规则
            - Path=/order/** # 路径的规则

③测试 http://localhost:10010/order/101

端口请求访问的是网关,基于路由规则判断,拉取服务列表,进行负载均衡发送请求。

总结:

4.路由断言工厂 Route Predicate Factory

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

 

问题

  • PredicateFactory的作用是什么?

        读取用户定义的断言条件,对请求做出判断

  • Path=/user/**是什么含义?

        路径是以/user开头的就认为是符合的

5.过滤工厂GatewayFilterFactory

GatewayFilter是网关提供的一种过滤器,对进入网关的请求和微服务的返回的响应做处理

过滤工厂 

案例:所有进入userservice的请求添加一个请求头

请求头:Truth=itcast is freaking awesome!

①在gateway的配置文件application.yml添加过滤配置

 ②在user-service的UserController,获取请求头参数

@GetMapping("/prop")
public String prop(@RequestHeader(value = "Truth", required = false) String truth) {
    return truth;
}

③访问http://localhost:10010/user/prop

注意:

所有的路由都生效的过滤器

总结

  • 过滤器的作用是什么?

        对路由的请求或响应做加工处理,比如添加请求头

        配置在路由下的过滤器只对当前路由的请求生效

  • defaultFilters的作用是什么?

        对所有路由都生效的过滤器

6.全部过滤器

实现GlobalFilter接口

public interface GlobalFilter {
   Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

ServerWebExchange:请求上下文,获取request,response信息

GatewayFilterChain:把请求交给下一个过滤器

案例:定义全局过滤器,拦截并判断用户身份

判断请求的参数是否满足下面条件:

  • 参数中是否有authorization,
  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

步骤:

①在gateway编写自定义全局过滤器

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      // 1.获取请求参数
      MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
      // 2.获取参数的authorization
      String auth = params.getFirst("authorization");
      // 3.判断是否是admin
      if ("admin".equals(auth)){
         // 放行
         return chain.filter(exchange);
      }

      //4.不放行就禁止
      exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
      // 5.结束处理
      return exchange.getResponse().setComplete();
   }
}

②发起请求

 总结

 

7.过滤器执行顺序

请求进入网关会碰到三类过滤器:DefaultFilter、当前路由的过滤器、GlobalFilter

①每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。

②当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器

8.跨域问题处理

在实际项目中,前后端分成两个不同的项目,各自部署在不同的域名下,这也就会遇到跨域问题了。浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS

 

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

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

相关文章

Python —— Reference | hou

Houdini有非常多的Python模块可使用&#xff0c;不止一个hou&#xff0c;如hutil、toolutils、husd、kramautils等&#xff0c;只是帮助文档并没有提起&#xff0c;可从源代码docstring中查询&#xff1b; //查询有效的模块 help(modules) hou模块按功能可分为三类&#xff1a;…

windows 10下安装Pytorch的操作文档与避坑指南

前言 PyTorch3D 是 Facebook AI Research (FAIR) 开发的一个用于 3D 计算机视觉任务的开源深度学习库。它是建立在 PyTorch 框架之上的&#xff0c;并旨在为研究人员和工程师提供处理 3D 数据、渲染和几何计算的工具和模块。 PyTorch3D的用途&#xff1a; 3D 几何操作&#x…

Linux 内核启动分析

Linux 内核启动分析-BugMan-ChinaUnix博客 通过《Linux应用程序elf描述》&#xff0c;我们了解到一个应用程序编译后&#xff0c;最终会按照指定方式进行链接&#xff0c;而我们通过ld --verbose可以查看对应应用的默认链接方式。那么对于Linux内核呢&#xff1f;毫无疑问&…

大模型背景下软件工程的机遇与挑战

点击链接了解详情 本文作者&#xff1a;汪晟杰 导语:AISE&#xff08;AI Software Engineering&#xff09;有人说是软件工程 3.0&#xff0c;即基于大模型&#xff08;LLM - Large Language Model&#xff09;时代下的软件工程。那么究竟什么是 AISE&#xff0c;他的发展历程对…

Java学习入门偏(2)

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; Hello&#xff0c;亲爱的各位友友们&#xff0c;好久不见&#xff0…

官媒代运营:内容营销是什么?为什么要做内容营销?

在当今数字化时代&#xff0c;信息传播的速度和途径前所未有地广泛&#xff0c;企业们正在寻找新的方法来吸引潜在客户并保持现有客户的忠诚度。在这个背景下&#xff0c;内容营销崭露头角&#xff0c;成为了企业推广和营销的一项重要策略。 今天媒介易来跟大家分享干货知识&am…

Mini小主机All-in-one搭建教程6-安装苹果MacOS系统

笔者使用的ESXI7.0 Update 3 抱着试试的态度想安装一下苹果的MacOS系统 主要步骤有2个 1.解锁unlocker虚拟机系统 2.安装苹果MacOS系统 需要下载的文件 unlocker 这一步是最耗时间的&#xff0c;要找到匹配自己系统的unlocker文件。 https://github.com/THDCOM/ESXiUnloc…

VMware vCenter Server 6.7安装过程记录

0、前言 最近由于一些原因需要安装测试VMware ESXi&#xff0c;无奈所有服务器都是十几年前的&#xff0c;配置低也不支持。后来通过VMware兼容性列表查询&#xff0c;快要放弃的时候发现唯一一台Dell R420&#xff0c;如获至宝。通过查询得知最高支持到6.5 U3&#xff0c;好在…

214. Devu和鲜花

214. Devu和鲜花 - AcWing题库 如果每个盒子里的花的数量是无限的&#xff0c;用隔板法可以得出答案是 现在每个盒子中区的花数要满足n个条件 我们可以求答案的补集&#xff0c;用全部方案数减去补集方案数 每一个不符合条件的要求为&#xff0c;设为Bi 补集方案数为就成了…

内存卡怎么格式化?2个方法就足够!

“我是一名摄影业余爱好者&#xff0c;之前的内存卡里存了很多的文件&#xff0c;导致容量满了。我想将内存卡格式化后继续使用&#xff0c;但是不知道应该如何操作&#xff0c;谁能给些建议吗&#xff1f;” 内存卡格式化是维护存储设备性能和数据安全的关键操作之一。当我们发…

CRM系统在销售目标管理中的作用是什么?

销售管理者为了激励销售人员、评估业绩、进行奖励&#xff0c;往往需要建立一个基本标准&#xff0c;就是人们常说的销售目标。设定销售目标时&#xff0c;既要激励到员工&#xff0c;又不能把标准定得过高。CRM系统在销售目标管理中起到什么作用&#xff1f;该如何通过CRM销售…

yolov作者简介

作者简介 作者叫Joseph Redmon&#xff0c;在谷歌学术上搜索作者的简介。 地址&#xff1a;‪Joseph Redmon‬ -巨人学术搜索‬‬ (cljtscd.com) 他提出了最著名的YOLO算法。其中YOLOV1的引用量达到了40287次。 gitihub地址&#xff1a;github地址 主页&#xff1a;个人主页

复杂业务逻辑的判断与优化

作者 刘希忱 在日常开发工作当中&#xff0c;优秀的用户界面数据库、构建工具、样式预处理器是前端现工作阶段必不可少的三大利器&#xff0c;很多优秀的团队已经为我们提供了很多便利的解决方案&#xff0c;但仍然有很多开发场景需要提升优化&#xff0c;比如声明、输出、判…

Cobalt Strike 钓鱼工具使用

免杀 安装 需要js环境 介绍 obalt Strike是一款基于java的渗透测试神器&#xff0c;常被业界人称为CS神器。自3.0以后已经不在使用Metasploit框架而作为一个独立的平台使用&#xff0c;分为客户端与服务端&#xff0c;服务端是一个&#xff0c;客户端可以有多个&#xff…

mysql varchar int

年龄是数字类型int SELECT * FROM test ORDER BY age; 年龄是字符类型varchar SELECT * FROM test ORDER BY code; 第1种 补前导0可以和数字一样排序 MySQL会比较字符的ASCII值&#xff0c;并根据这些值来确定字符的排列顺序。 印象中oracle好像也是吧。 ASCII (American …

【yolov8目标检测】使用yolov8训练自己的数据集

目录 准备数据集 python安装yolov8 配置yaml 从0开始训练 从预训练模型开始训练 准备数据集 首先得准备好数据集&#xff0c;你的数据集至少包含images和labels&#xff0c;严格来说你的images应该包含训练集train、验证集val和测试集test&#xff0c;不过为了简单说…

2023年10月中国数据库排行榜:墨天轮榜单前五开新局,金仓、亚信热度攀升

怀鸿鹄之志&#xff0c;展骐骥之跃。 2023年10月的 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月共有286个数据库参与排名。本月排行榜前十名变动较大&#xff0c;**华为 openGauss 重归探花之位&#xff0c;人大金仓 KingBase 热度上升&#xff0c;亚信 AntDB 进军10…

开源软件-禅道Zentao

禅道Zentao 简介漏洞复现SQL注入漏洞**16.5****router.class.php SQL注入** **v18.0-v18.3****后台命令执行** 远程命令执行漏洞&#xff08;RCE&#xff09;后台命令执行 简介 是一款开源的项目管理软件&#xff0c;旨在帮助团队组织和管理他们的项目。Zentao提供了丰富的功能…

Spring Security—Servlet 应用架构

目录 一、Filter&#xff08;过滤器&#xff09;回顾 二、DelegatingFilterProxy 三、FilterChainProxy 四、SecurityFilterChain 五、Security Filter 六、打印出 Security Filter 七、添加自定义 Filter 到 Filter Chain 八、处理 Security 异常 九、保存认证之间的…

关于统信UOS不能使用“modprobe brd”创建内存盘的问题

前言 我自用的电脑内存都比较大&#xff0c;因此很早就养成了使用内存做临时盘的习惯 内存盘的好处很多&#xff0c;比如将系统临时文件夹、浏览器缓存文件等设置到内存盘&#xff0c;不仅可以提升速度&#xff0c;还可以减少对固态硬盘的写入&#xff0c;提升固态盘的使用寿…