Spring Cloud Alibaba整合 Nacos注册、配置中心和Gateway网关路由

简介: Spring Cloud Alibaba整合 Nacos注册、配置中心和Gateway网关路由

环境以及版本说明

工具 版本
JDK 1.8.0_301
MySQL 5.7.36
IDEA 2021.3.3
Maven 3.8.5
SpringBoot 2.7.1
SpringCloud 2021.0.3
MyBatis-Plus 3.2.0
Docker 20.10.17
Nacos 1.2.1

0、启动Nacos Server


5b621a99dc7c48b79363cf1487cb21d8.png

访问Nacos首页:http://localhost:8848/nacos/#/login

登录默认账户和密码:nacos

5174a1c7afc146ceac8528bf7ebf1c7e.png

1、如何使用Nacos作为注册中心

1.1)引入nacos-config依赖

         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>

b3268c045a19499188dfc128a2b48c22.png

1.2) application.yml配置

application.yml 中配置 Nacos server 的地址和应用名

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.10.129:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon
mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
server:
  port: 7000

4267452617b848a39a7ce4c78a109ff0.png

1.3)将服务注册进nacos server中

使用注解@EnableDiscoveryClient

65c83d2c521c4d1c936db47855508d2d.png

检查Nacos Server发现注册进来了

b3d6793cd1f547b09f7f0b203db12e86.png

1.4)OpenFeign申明式远程服务调用

目的:让会员服务远程调用优惠券服务

想要远程调用别的服务

1)引入OpenFeign依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>


a451eb2e56ff41abb606b27178338b51.png

49b336fba5234db8b114e08a684e161e.png

2)编写一个接口,告诉SpringCloud这个接口需要调用远程服务

/**
 * 这是一个声明式的远程调用
 */
@FeignClient(name = "gulimall-coupon")
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}

8e1ddae383874c6ea4d8767471015565.png


声明接口的每一个方法都是调用哪个远程服务的那个请求

3)开启远程调用功能

@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }
}

13edca28f51d4e78a3717d3b450fb3ee.png3a8ff5c542be43e491f0a697623bcc7d.png

坑:

这里启动失败了,报错是LoadBalance出错

解决办法:需要引入spring-cloud-loadbalancer依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

2、如何使用Nacos作为配置中心

2.1)引入nacos-config依赖

        <!--        配置中心来做配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2.2)创建 bootstrap.properties 并在其中配置 Nacos server 的地址和应用名

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

0a78c3f4774d4fcc85e0fb717d4415e5.png

写一个Controller方法

@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;
    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;
    @RequestMapping("/test")
    public R test(){
        return R.ok().put("name",name).put("age",age);
    }

a344b69eb5174c7bb3d787a8504b7651.png

访问http://localhost:7000/coupon/coupon/test

发现读取的是系统变量的名字,并没有读取到我们在application.propertoes中设置的

user.name=zhangsan2
user.age=20

注意:

要写上模块的前缀名coupon,才能读取到

coupon.user.name=zhangsan2
coupon.user.age=20

但是每次如果要修改配置就要去application.propertoes中设置,这是很不方便的。因为微服务还要重启,这在生产中是不能接受的,所以我们采用Nacos来做统一的配置管理中心

2.3)需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-coupon.properties。默认规则,应用名.properties


682c72f1fa3643b18d6605e5cc9f6776.png

并给 应用名.properties 添加配置

afcfef512beb493f8a2a6c3e63956632.png

2.4)动态获取配置。

使用注解:@RefreshScope:动态获取并刷新配置

@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;
    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;
    @RequestMapping("/test")
    public R test(){
        return R.ok().put("name",name).put("age",age);
    }

f91f2fa179e941ae87fc11d7f89d8947.png

注意:

@Value(“${配置项的名}”):获取到配置。


如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。

2.5) 细粒度管理Nacos配置中心

2.5.1)命名空间:配置隔离;

默认:public(保留空间);默认新增的所有配置都在public空间。


7fde9390391a483dadaf8676ebb673ef.png

1、开发,测试,生产:利用命名空间来做环境隔离。

8dd1fa35d6464efbabdbacc63c2a86fe.png

启动微服务后发现系统会默认使用public下的gulimall-coupon.properties文件

如果想要读取指定的命名空间下的gulimall-coupon.properties文件,那就需要在

注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,

9c011e8275e24e95b138657c56a8e42b.png

    spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871

2.5.2) 每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

05850c88f22d487087e8c67b61809e71.png

2.5.3)配置分组:

默认所有的配置集都属于:DEFAULT_GROUP;

项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod

b9d2006ed0e54f8aabd1cbbc6d068999.png


ab6598ff8af34406bb030d136da09cd8.png

2.5.4)同时加载多个配置集

  • 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
  • f72e745b6f774e8e92a173608697fabe.png

af101b56bb64405fa1fd4fe9b1658b74.png



dc3e32d69f2142d5b698c3d79245dc26.png


bc8d098ed5f44bddba4fa8b3ebd5cbb7.png

  • 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可

95c6b7d0521f4203add81917a5a27f67.png

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=c57909ca-177f-4817-b4b6-17707f4c2237
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
  • 3)、@Value,@ConfigurationProperties。。。
  • 以前SpringBoot任何方法从配置文件中获取值,都能使用。
  • 配置中心有的优先使用配置中心中的,

2.6)启动服务发现示例图

ce002dbbfa4043ddacda9801848e4991.png


3)Gateway网关路由

三大组件:路由(Router)、断言(Predicate)、过滤(Filter)

3.1)工作流程图

91b09ae713e74410a03480867ea6913e.png

3.1.1)引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

6aaf1c7449d344a3b04aff21f16282ec.png

3.1.2)开启服务注册发现

配置nacos的注册中心地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

5207ec2833c84eb8a6e633bc81b5bc97.png

3.2)在Nacos Server里注册网关

2684c8f8263d49b8858738eae069b45f.png

3.3)配置网关

b0096106493f48bdab51ca919999d74f.png

3.4)编写application.yml配置文件进行路由转发

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq


1b4bee5e3fa94940ac2e6b7e6895eb56.png

3.5)启动网关微服务,测试是否能转发请求到指定网页

访问:http://localhost:88/?url=qq

发现成功



访问:http://localhost:88/?url=baidu

发现也是成功的


至此:

Spring Cloud Alibaba整合 Nacos配置注册中心和Gateway网关路由成功


相关文章
|
6月前
|
存储 缓存 负载均衡
Gateway 网关坑我! 被这个404 问题折腾了一年?
小富分享了一个困扰团队一年多的 SpringCloud Gateway 路由 404 问题。通过日志追踪和源码分析,发现是网关在 Nacos 配置更新后未能正确清理旧的路由权重缓存,导致负载均衡时仍使用已删除的路由数据。最终通过监听路由刷新事件并手动更新缓存,成功解决了问题。
1059 125
Gateway 网关坑我! 被这个404 问题折腾了一年?
|
5月前
|
机器学习/深度学习 Kubernetes API
【Azure APIM】自建网关(self-host gateway)收集请求的Header和Body内容到日志中的办法
在Azure API Management中,通过配置trace策略可完整记录API请求的Header和Body信息。在Inbound和Outbound策略中分别使用context.Request/Response.Headers和Body.As&lt;string&gt;方法捕获数据,并写入Trace日志,便于排查与审计。
187 8
|
7月前
|
安全 虚拟化
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
156 0
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
1570 142
|
Cloud Native Java Nacos
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
4763 14
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
815 0
|
6月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
5月前
|
缓存 JSON NoSQL
别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
小富分享Spring Cloud Gateway内置30+过滤器,涵盖请求、响应、路径、安全等场景,无需重复造轮子。通过配置实现Header处理、限流、重试、熔断等功能,提升网关开发效率,避免代码冗余。
585 1
|
8月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
583 0
|
9月前
|
缓存 监控 Java
说一说 SpringCloud Gateway 堆外内存溢出排查
我是小假 期待与你的下一次相遇 ~
1239 5

热门文章

最新文章