SpringCloud集成Gateway

SpringCloud集成Gateway

​ 拖了很久,目前最后一篇SpringCloud的博客终于写了。这个坑算是告一段落了。最后一篇博客就是整合Gateway。也不说其他的了,直接开始吧。

​ 其实写了这么久,应该了解了SpringCloud是有多个组件组成的,每个部分都有许多替代品,网关这个部分也不例外。其实最开始我一直在纠结选择哪个组件。目前比较好和流行的有Zuul和Gateway。但是Zuul2.0后就闭源了,所以一直在纠结,最后还是选择了Gateway。

​ Gateway的官网地址:https://spring.io/projects/spring-cloud-gateway其实这个地址其他的组件也能找到,之前没有关注这个网址,后续大家可以在上面了解一下详细的写法和demo。

​ 该项目提供了一个用于在Spring MVC之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注,例如:安全性,监视/指标和弹性。它的功能有以下几点。

  • 基于Spring Framework 5,Project Reactor和Spring Boot 2.0构建

  • 能够匹配任何请求属性上的路由。

  • 谓词和过滤器特定于路由。

  • Hystrix断路器集成。

  • Spring Cloud DiscoveryClient集成

  • 易于编写的谓词和过滤器

  • 请求速率限制

  • 路径改写

​ 不难看到其实网关的一部分功能和其他的组件有些重合。这个后面会有一个问题。关于Gateway的原理这里不再叙述了,作为后续的一个扩展点(又是一个坑)。就直接整合。

​ 需要添加Gateway的依赖,同时Gateway作为一个服务也是需要注册到Eureka注册中心的。

​ 使用IDEA直接创建一个新模块,指定好名称和需要添加的依赖,这里只选择Gateway和Eureka-client就可以了。截图如下:

​ 添加模块:

image-20200724103944533

​ 选择两个依赖:

image-20200724104143276

image-20200724104212862

​ 后面直接下一步就可以最后把pom文件中的父模块修改为自己的父模块就可以了。剩下就没有什么了。然后就是修改启动类,添加@EnableDiscoveryClient注解。最后就是在application.yml中增加一些配置。配置如下:

server:
  port: 8084
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: eureka-client
          uri: lb://eureka-client
          predicates:
            - Path=/eureka-client/**
    loadbalancer:
      ribbon:
        enabled: false

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka
  instance:
    prefer-ip-address: true

​ 下面说一下这个配置文件需要注意的事。

  • uri后面填写的是你服务的地址,例如:http://www.baidu.com。这里填写lb://eureka-client代表从注册中心获取eureka-client的服务。

  • predicates是过滤原则,不能为空,必须要填。可以从其他地方了解一个这个如何填。我这里的意思是只要url为:http://127.0.0.1:8084/eureka-client/**的请求都会转到对应的服务上去处理。

  • id就是id,没有啥特殊的含义或者用处。

  • 转到对应的服务时,请求地址会有一定的变化,还是上面那个链接,如果请求的服务端口为8081,则这个请求经过网关路由转化为:http://127.0.0.1:8081/eureka-client/**=,其实就是把端口号换了一下,所以我在服务模块添加了一个全局请求前缀:/rureka-clien

  • 下面的eureka客户端的配置没有什么可以讲的,和其他的一样。

  • 启动的时候报了一个警告,大意是提醒已经启用了Ribbon,可能会有冲突。所以添加了配置:``spring.cloud.loadbalancer.ribbon.enabled=false,这里是为了不让这个告警出现(强迫症),要看自己项目是否需要。

    You already have RibbonLoadBalancerClient on your classpath. It will be used by default. As Spring Cloud Ribbon is in maintenance mode. We recommend switching to BlockingLoadBalancerClient instead. In order to use it, set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or remove spring-cloud-starter-netflix-ribbon from your project.
    

​ 剩下就没有什么可以讲的了,启动项目测试一下就可以了,看看最后服务会不会经过路由转换为相应的服务。我最后是测试成功的。

image-20200724105846220

​ SpringCloud的内容就暂时告一段落了,这个主要还是熟悉SpringCloud,了解它的一些基础概念,具体到实际开发可能有很大的差异,例如单点登录的整合和跨域的处理,这些我都没有写。所以主要还是作为一个练手项目,了解就可以了。后续还是会持续更新的。(坑多不愁)。

​ 就这样吧,结束。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是使用 Spring Cloud Gateway 集成 WebSocket 的步骤: 1. 引入依赖:在 pom.xml 文件中添加 Spring Boot Webflux、Spring Cloud Gateway 和 Spring Boot WebSocket 的依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 配置 Gateway:在 application.yml 文件中添加 Gateway 的路由规则和 WebSocket 的配置。 ```yaml spring: cloud: gateway: routes: - id: websocket_route uri: lb://websocket-server predicates: - Path=/websocket/** filters: - RewritePath=/websocket/(?<segment>.*), /$\{segment} server: port: 8080 logging: level: org.springframework.cloud.gateway: TRACE --- spring: profiles: websocket server: port: 9090 logging: level: org.springframework.boot.web.reactive.socket: TRACE ``` 3. 配置 WebSocket:创建一个 WebSocket 配置类来注册 WebSocketHandler 和 HandshakeHandler。 ```java @Configuration public class WebSocketConfiguration { @Bean public HandlerMapping webSocketHandlerMapping(WebSocketHandler webSocketHandler) { Map<String, WebSocketHandler> map = new HashMap<>(); map.put("/websocket", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); handlerMapping.setOrder(1); handlerMapping.setUrlMap(map); return handlerMapping; } @Bean public WebSocketHandlerAdapter handlerAdapter() { return new WebSocketHandlerAdapter(); } @Bean public WebSocketHandler webSocketHandler() { return new MyWebSocketHandler(); } @Bean public HandshakeHandler handshakeHandler() { return new MyHandshakeHandler(); } } ``` 4. 编写 WebSocketHandler 和 HandshakeHandler:创建一个 WebSocketHandler 类,实现 WebSocketHandler 接口,并在其中实现 WebSocket 的相关逻辑。创建一个 HandshakeHandler 类,实现 HandshakeHandler 接口,并在其中实现 WebSocket 的握手逻辑。 ```java public class MyWebSocketHandler implements WebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(MyWebSocketHandler.class); @Override public Mono<Void> handle(WebSocketSession session) { logger.info("WebSocket session opened: " + session.getId()); return session.send(session.receive() .map(webSocketMessage -> "Echo: " + webSocketMessage.getPayloadAsText()) .map(session::textMessage) ); } } public class MyHandshakeHandler extends DefaultHandshakeHandler { @Override protected Mono<ServerHttpRequest> upgrade(ServerHttpRequest request, ServerHttpResponse response, HttpHeaders headers, WebSocketHandler wsHandler) { headers.setOrigin("*"); return super.upgrade(request, response, headers, wsHandler); } } ``` 5. 启动应用程序:启动应用程序并访问 WebSocket 的端点。 以上就是使用 Spring Cloud Gateway 集成 WebSocket 的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值