Spring Cloud Gateway + Nacos(1)简单配置

时间:2024-02-01 11:50:07

当初我学习时候就是参考这位大佬的博客: Nacos集成Spring Cloud Gateway 基础使用
现在学习到spring cloud alibaba 使用nacos做服务中心,dubbo做通信,大体流程就是:

  • ​ 先制定要的接口打包上传到云。提供者和消费者都依赖这个接口包

  • ​ 而后新建提供者模块来实现接口,再将服务注册到nacos上面

  • ​ 新建消费者模块来使用接口,消费者去nacos上面寻找提供者根据服务名

  • ​ 消费者到nacos和nacos到提供者都是使用dubbo通信实现。

本篇博客只介绍网关到消费者。首先先创建消费者(当然如果只看网关到消费者,那么消费者应该称之提供者,网关应该称之为消费者)如下:

1. 新建maven模块nacos-consumer1添加pom依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--nacos注册发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--如果使用本地nacos,此依赖可以省略,因为云端nacos启动时候会检测云端配置-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. 在resources下新建文件bootstrap.yml文件

注:nacos是区分yaml和yml格式的,虽然本地加载时候是会区分的,但是使用云端配置时候就得严格使用yml文件类型,而且本地yaml文件是没有代码提醒的。至于application.yml、application.properties和bootstrap.yml的区别可以百度了解

server:
  port: 8011  #consumer2的端口是8012

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508 
        # nacos上面新建命名空间的id
      config:   # 本地一般不需要配置中心,如果使用云nacos会报找不到配置的错误,
                #这时候需要配置上,或者config.enable: false关闭即可
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508

consumer2上面只是端口不一样,服务名nacos-consumer是一样的,为了测试负载均衡。

3. 创建controller类com.example.controller.HelloController.java

@RestController
@RequestMapping("/testhello")
public class HelloController {

    @GetMapping("/hello")
    public String HelloController(){
        // consumer2则修改返回值为consumer2
        return "This is nacos-consumer1";
    }
}

4. 创建启动类com.example.NacosConsumerOneApplication(与Two)

@SpringBootApplication
public class NacosConsumerOneApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerOneApplication.class, args);
    }
}

5. 接下来创建网关模块nocas-gateway,引入pom依赖

<!--nacos注册发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--如果使用本地nacos,此依赖可以省略,因为云端nacos启动时候会检测云端配置-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

6. 然后在resources下面创建bootstrap.yml文件

server:
  port: 8001

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508
        # nacos上面新建命名空间的id
      config:   # 本地一般不需要配置中心,如果使用云nacos会报找不到配置的错误,
        #这时候需要配置上,或者config.enable: false关闭即可
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508

    gateway:
      discovery:
        locator:
          enabled: true               #默认false,开启后可以通过ip:port/服务名称/接口地址进行服务转发
                                      # 即: localhost:8001/nacos-consumer/testhello/hello
          lower-case-service-id: true #把服务名转换为小写,Eureka 中默认都是大写
                                      #但是nacos不会自动全部转换为大写,除非手动写成大写,所以也可以不写。
      routes:                         # 路由转发:最重要的地方
        - id: nacos-gateway-provider  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://nacos-consumer    #匹配后提供服务的路由地址,lb代表负载均衡
          predicates:
            - Path=/testhello/hello   #断言,路径相匹配的进行路由转发

比起消费者来说,网关这里就多了gateway部分,那么将其中可以省略的地方省去就是添加:

server:
  port: 8001

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508
        # nacos上面新建命名空间的id
      config:   # 本地一般不需要配置中心,如果使用云nacos会报找不到配置的错误,
        #这时候需要配置上,或者config.enable: false关闭即可
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508

    gateway:
      routes:                         # 路由转发:最重要的地方
        - id: nacos-gateway-provider  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://nacos-consumer    #匹配后提供服务的路由地址,lb代表负载均衡
          predicates:
            - Path=/testhello/hello   #断言,路径相匹配的进行路由

7. 接下来创建com.example.NacosGatewayApplication.java

@SpringBootApplication
public class NacosGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosGatewayApplication.class, args);
    }
}

8. 启动两个消费者,一个网关测试端口

  • 本地nacos登录 http://127.0.0.1:8848/nacos/index.html ,账号密码都是nacos就可以看到配置和服务。可以查看自己服务是否上线

  • 可以通过 http://localhost:8011 和 8012/testhello/hello 测试消费者,就是两个正常的controller

  • 网关启动后通过网关localhost:8001.testhello/hello能都转发到上面其中一个

  • 测试 8011/testhello/hello显示This is nacos-consumer1,8012显示consumer2

  • 测试 http://localhost:8001/testhello/hello 并且不断刷新显示内容会在两个消费者之间相互切换。这就是负载均衡,当然是默认的负载均衡算法,我们也可以自定义。

这就是spring cloud gateway最基础的配置方法,之后会大概写谓词predicates中的内容和过滤器Filter的笔记。


学无止境,代码与生活,谁也不能亏待了。2021年5月12日 22:30:29