企业网站功能介绍,网站开发成本核算及账务处理,wordpress版权,怎么制作游戏u盘SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加#xff0c;一定会产生多个接口地址#xff0c;那么客户端调用多个接口只能使用多个地址#xff0c;维护多个地址是很不方便的#xff0c;这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服…SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加一定会产生多个接口地址那么客户端调用多个接口只能使用多个地址维护多个地址是很不方便的这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服务网关就充当这样的角色。 Gateway
网关为众多微服务挡在前面做路由转发、监控、限流、鉴权等功能。SpringCloudGateway就是其实现之一。SpringCloudGateway借鉴了Spring Cloud Netfilix Zuul的思想它的目标是替代Zuul。
Gateway是基于WebFlux框架实现的而WebFlux底层是使用高性能框架Netty性能方面是Zuul的1.6倍且功能强大设计优雅。
Gateway的核心是路由、Predicate(断言)、Filter(过滤器)。路由是转发规则Predicate是判断Filter可以认为是请求被路由前或后加一点自定义逻辑。
SpringCloudGateway需要使用SpringBoot2.0及以上版本并且不可以在Tomcat或Jetty等Servlet容器运行必须是Jar包运行
集成Gateway
构建一个Gateway网关服务再创建两个服务:用户服务和商品服务架构如下 user服务的UserController用户服务端口8002
RestController
public class UserController {private final MapInteger, String userInfo new HashMapInteger, String() {{put(1, Zhangsan);put(2, Lisi);}};RequestMapping(/user/findById)public String findById(RequestParam(id) Integer id) {return userInfo.getOrDefault(id, null);}
}shop服务的ShopController商品服务端口8003
RestController
public class ShopController {private final MapInteger, String shopInfo new HashMapInteger, String() {{put(1, 这是苹果);put(1024, 芒果);}};RequestMapping(/shop/findById)public String findById(RequestParam(id) Integer id) {return shopInfo.getOrDefault(id, null);}
}创建一个gateway的服务
依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/exclusion/exclusions
/dependencyGateway中去除spring-boot-starter-web依赖gateway中有webflux依赖与starter-web有冲突。
bootstrap.yml加入配置
server:port: 8083spring:application:name: gateway # 服务名cloud:gateway:routes: # 路由可配置多个- id: user_route # 路由id唯一即可默认UUIDuri: http://localhost:8002 # 路由地址(匹配成功后的服务地址)order: 1 # 路由优先级默认0越低优先级越高predicates:- Path/user/** # 断言匹配规则- id: shop_routeuri: http://localhost:8003order: 1predicates:- Path/shop/**网关配置也可以使用JavaConfig的方式但是不推荐使用。
配置中表示当请求网关路径中地址是以/user/开头就路由到用户服务中/shop/开头路由到商品服务中。
测试一下
C:\Users\Admincurl http://localhost:8083/user/findById?id1
Zhangsan
C:\Users\Admincurl http://localhost:8083/shop/findById?id1024
芒果Gateway整合nacos
上面案例中uri都是写死的一些东西如果对应的具体服务地址改了那么就需要修改配置文件而且假如要提高用户承载量做负载均衡有很多个节点肯定不能只配置一个服务地址。
那么就需要用到nacos统一管理服务注册、发现网关路由转发的地址从nacos中拿就行。
那么用户服务和商品服务需要引入nacos服务发现注册依赖
!-- 服务注册 服务发现需要引入的 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency!--健康监控--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependencybootstrap.yml文件
------------------------User服务
server:port: 8002
spring:application:name: user # 应用名cloud:nacos:discovery:server-addr: localhost:8848 # nacos服务地址--------------------------Shop服务
server:port: 8003
spring:application:name: shop # 应用名cloud:nacos:discovery:server-addr: localhost:8848 # nacos服务地址最后记得启动类上启动nacos服务注册发现
SpringBootApplication
EnableDiscoveryClient // 启用服务注册发现
public class UserApp {public static void main(String[] args) {SpringApplication.run(UserApp.class, args);}
}
欧克那么同样地gateway服务也要启用服务注册发现
依赖
!-- 服务注册 服务发现需要引入的 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependencybootstrap.yml配置如下
server:port: 8083spring:application:name: gateway # 服务名cloud:nacos:discovery:server-addr: localhost:8848 # nacos地址gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的服务gateway自动根据服务发现为每一个服务创建了一个router# 这个router将以服务名开头的请求路径转发到对应的服务routes: # 路由可配置多个- id: user_route # 路由id唯一即可默认UUIDuri: lb://user # 路由地址(匹配成功后的服务地址) user是用户服务的服务名称order: 1 # 路由优先级默认0越低优先级越高predicates:- Path/user/** # 断言匹配规则- id: shop_routeuri: lb://shop # 路由地址(匹配成功后的服务地址) shop是商品服务的服务名称order: 1predicates:- Path/shop/**
启动尝试下
C:\Users\Admincurl http://localhost:8083/user/findById?id1
{timestamp:2023-08-05T00:34:40.68400:00,path:/user/findById,status:503,error:Service Unavailable,requestId:f5f6d217-1}
C:\Users\Admincurl http://localhost:8083/user/findById?id1
{timestamp:2023-08-05T00:35:50.22300:00,path:/user/findById,status:503,error:Service Unavailable,requestId:21a722a2-1}哈服务不可用经查阅资料得知缺少ReactiveLoadBalancerClientFilter过滤器需要LoadBalancerClientFactory类但是需要引入相关依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-loadbalancer/artifactId
/dependency可以了再试下
C:\Users\Admincurl http://localhost:8083/shop/findById?id1024
{timestamp:2023-08-05T01:19:34.18300:00,status:404,error:Not Found,path:/findById}
C:\Users\Admincurl http://localhost:8083/user/findById?id1
{timestamp:2023-08-05T01:19:34.18300:00,status:404,error:Not Found,path:/findById}好嘞漂亮踩了大坑了一直404
经过百般挣扎查资料看源码调试等等手段明白原因了…
spring:application:name: gateway # 服务名cloud:nacos:discovery:server-addr: localhost:8848 # nacos地址gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的服务gateway自动根据服务发现为每一个服务创建了一个router# 这个router将以服务名开头的请求路径转发到对应的服务重点来了注意看:
当你的gateway配置了locator.enabled: true时gateway自动根据服务发现为每一个服务创建了一个router 这个router将以服务名开头的请求路径转发到对应的服务相当于人家给你自动生成了route规则你自己都不用配置了。
但是你的请求中必须要带着服务端的服务名才可以进行访问到
以上述为例如果要访问到user服务的/user/findById那么请求地址为localhost:8083/user/user/findById
C:\Users\Admincurl http://localhost:8083/user/user/findById?id1
Zhangsan如何选择 提供两种写法 实际上如果项目路径比较简单直接让gateway和nacos自动生成即可 spring:application:name: gateway # 服务名cloud:nacos:discovery:server-addr: localhost:8848 # nacos地址gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的服务gateway自动根据服务发现为每一个服务创建了一个router# 这个router将以服务名开头的请求路径转发到对应的服务请求时记得带上服务端的application.name名称即可如locahost:8083/user/user/findById第一个user是服务名称 假如不想这么做想直接以一个路径跳到对应的服务中去不去写服务名那么我们需要自定义routes server:port: 8083spring:application:name: gateway # 服务名cloud:nacos:discovery:server-addr: localhost:8848 # nacos地址gateway:routes: # 路由可配置多个- id: user_route # 路由id唯一即可默认UUIDuri: lb://user # 路由地址(匹配成功后的服务地址) user是用户服务的服务名称order: 1 # 路由优先级默认0越低优先级越高predicates:- Path/user/** # 断言匹配规则不使用nacos自动生成的routes自己定义那么我们访问时localhost:8083/user/findById就能正常访问到user服务下的/user/findById资源了。 C:\Users\Admincurl http://localhost:8083/user/findById?id1
Zhangsan两种方式都可以使用根据项目的实际情况选择。locator.enabled: true只要在gateway中配置了那么你在进行网关路由时请求地址的第一个目录一定是服务名称。