微服务_入门2

文章目录

一、Feign远程调用

来看我们以前利用RestTemplate发起远程调用的代码:

存在下面的问题:

  • 代码可读性差,编程体验不统一(url需要自己在代码中拼写出来)
  • 参数复杂URL难以维护(有时候访问一个页面所携带的参数是非常多的)

Feign是一个声明式的http客户端。其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

通过导包和添加注解后,可以写出一个通用http请求用接口:

java 复制代码
@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User

  这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。基于UserClient接口可以完成http请求,就像是调用另外一个方法一样,是不是看起来优雅多了:

二、Gateway服务网关

  Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

2.1、为什么需要网关

  Gateway网关是我们服务的守门神,所有微服务的统一入口。

  • 身份认证和权限校验:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
  • 服务路由、负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
  • 限流:当请求流量过高时,在网关中按照下游的微服务能够接受的速度来放行请求,避免服务压力过大。

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

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

2.2、gateway快速入门

在application.yml文件中,配置如下(演示路由的功能实现):

yaml 复制代码
server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。

本例中,我们将 /user/**开头的请求,代理到lb://userservice,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。

整个访问的流程如下:

路由配置包括:

  1. 路由id:路由的唯一标示

  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

  3. 路由断言(predicates):判断路由的规则

  4. 路由过滤器(filters):对请求或响应做处理

2.3、断言工厂

  我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory(断言工厂)读取并处理,转变为路由判断的条件 。例如Path=/user/是按照路径匹配,这个规则是由:

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个,我们不需要记忆,随用随查就好。

断言:是一种在程序设计中的一阶逻辑(例如:一个结果为真或假的逻辑判断表达式),目的是为了表示与验证软件开发者预期的结果。

2.4、过滤器

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

  Spring提供了31种不同的路由过滤器工厂,比如:添加请求头、添加请求参数等。也可以通过实现接口,自己写过滤逻辑。

相关推荐
zhangjw346 小时前
第41篇:微服务入门:架构理念+核心组件,理解微服务本质
微服务·云原生·架构
星期一研究室8 小时前
从一条分割线开始,在文档中打造你的内容节奏
微服务·产品·设计
Raas1009 小时前
MAIGateway,魔芋企业级AI网关的安全基建化设计
大数据·人工智能·网关·网络安全·api网关·mai gateway·魔芋
智码看视界10 小时前
Day49-AI微服务化-将大模型能力封装为标准微服务
java·微服务·ai·架构·大模型·sse流式输出·ai中台
youngerwang1 天前
【软件系统架构案例分析每日深耕 Day 17】CBAM成本效益分析:微服务改造决策
微服务·系统架构·cbam·案例每日深耕·微服务改造
星期一研究室1 天前
告别文档「图片灾难排版」!3大黄金法则,让你的文档从杂乱无章到杂志风🧩
微服务·产品·设计
AI产品测评官2 天前
突破系统割裂困局:2026企业级AI招聘架构如何迈向“原生全流程”?
大数据·微服务·架构
Java成神之路-2 天前
集群架构 vs 分布式微服务架构:核心区别通俗拆解
分布式·微服务·架构
952362 天前
Spring-cloud配置中心
java·spring·spring cloud·微服务
SL-staff2 天前
JVS数字底座实践:如何复用企业文档能力快速构建知识类应用
低代码·微服务·springcloud·知识管理·权限控制·jvs·elasticsea