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网关路由成功


相关文章
|
10天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
25 4
|
12天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
81 1
|
7天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
19 0
|
8天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
56 1
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
178 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
13天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
22 3
|
14天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
17 2
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
64 5
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
169 1