• Spring Cloud Gateway(二):Spring Cloud Gateway整合Eureka应用


     

     

    Spring Cloud Gateway 应用概述

    下面的示例启动两个服务:gataway-server 和 user-service 都注册到注册中心 Eureka上,客户端请求后端服务【user-service】,网关提供后端服务的统一入口。网关通过负载均衡将客户端请求转发到具体的后端服务。

    image

    序号服务名称端口号备注
    1 gateway-server 9000 网关服务
    2 user-service 8001 用户服务
    3 eureka-server 8888 注册中心

    用户服务搭建

    用户服务比较简单,只需要注册到注册中心并提供一个测试接口 /user

    Maven 依赖

    <!--注册中心客户端-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--actuator 监控-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <!--配置中心客户端-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    

    配置文件

    #服务暴露顿口号
    server.port=8001
    #服务名称
    spring.application.name=user-service
    
    #注册中心地址
    eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8888}/lb/eureka/
    
    management.endpoint.conditions.enabled=true
    #优先使用IP地址注册
    eureka.instance.prefer-ip-address=true
    ##服务所属分组名称
    #eureka.instance.app-group-name=lkf_group
    #服务实例id
    eureka.instance.instanceId=${spring.application.name}@${spring.cloud.client.ip-address}@${server.port}
            
    #开放所有页面节点  默认只开启了health、info两个节点
    management.endpoints.web.exposure.include=*
    

    暴露服务接口

    对外暴露 /user 接口,返回字符串 I’m ok

    @SpringBootApplication
    @EnableDiscoveryClient
    @RestController
    public class UserApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserApplication.class, args);
        }
    
        @GetMapping("/user")
        public String getUser() {
            return "I'm ok";
        }
    }
    

    网关服务搭建

    网关服务提供路由配置、路由断言和过滤器等功能。下面将会分别实现这些功能

    Maven 引用

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--注册中心客户端-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    

    配置文件

    注册到注册中心并读取服务列表,支持向注册中心服务列表中的服务路由,这里需要注意,如果 spring.cloud.gateway.discovery.locator.lowerCaseServiceId 不为true,则只能根据服务实例id的大写进行转发,不支持小写的serviceId

    #服务暴露顿口号
    server.port=9000
    #服务名称
    spring.application.name=gateway-server
    
    #注册中心地址
    eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8888}/eureka/
    
    management.endpoint.conditions.enabled=true
    #优先使用IP地址注册
    eureka.instance.prefer-ip-address=true
    ##服务所属分组名称
    #eureka.instance.app-group-name=lkf_group
    #服务实例id
    eureka.instance.instanceId=${spring.application.name}@${spring.cloud.client.ip-address}@${server.port}
    
    #开放所有页面节点  默认只开启了health、info两个节点
    management.endpoints.web.exposure.include=*
    #启用基于服务发现的路由定位
    spring.cloud.gateway.discovery.locator.enabled=true
    #启用服务实例id名称小写支持
    spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true
    
    

    路由断言

    路由断言有很多种,根据请求时间、Host地址、请求路径和请求方法等,这里实现一个基于路径的路由断言匹配

     @Bean
        public RouterFunction<ServerResponse> testFunRouterFunction() {
            RouterFunction<ServerResponse> route = RouterFunctions.route(
                    RequestPredicates.path("/test"), request -> ServerResponse.ok()
                            .body(BodyInserters.fromObject("I am testing")));
            return route;
        }
    

    当请求路径为 /test 时,直接返回结果为 I am testing

    过滤器

    网关经常需要对路由请求进行过滤,对符合条件的请求进行一些操作,例如:增加请求头、增加请求参数、增加响应头和断路器等功能。

     @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes().route(r -> r.path("/test/custom").uri("http://ww.baidu.com"))
                    .route(r -> r.path("/user/**").uri("lb://user-service"))
                    .build();
    
        }
    

    当请求路径为 /test/custom 时,网关将请求转发到 http://ww.baidu.com;

    当请求路径为 /user 时,网关将请求转发到用户服务的/user 接口 ,/user-service/user

    客户端访问

    向网关发送请求:http://127.0.0.1:9000/user ,
    被网关转发到 http://127.0.0.1:9000/user-service/user,得到结果为:I’m ok

    博主文章同步发布:https://blog.csdn.net/u010647035/article/details/83959552
  • 相关阅读:
    嫁给程序员1314的好处
    TCP/IP、Http、Socket、XMPP-从入门到深入
    Redis集群案例与场景分析
    Java程序片段
    Spring Security(08)——intercept-url配置
    python virtualenv virtualenvwrapper
    django 删除表后如何恢复
    mysql行转列,单列转多行
    mysql开发之join语句学习
    django前后端数据传输学习记录
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/13413741.html
Copyright © 2020-2023  润新知