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


相关文章
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
8天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
511 5
|
2月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
574 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
5天前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
16 0
|
2月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
2月前
|
负载均衡 Java 数据安全/隐私保护
网关路由-路由属性
网关路由-路由属性
42 1
|
2月前
|
负载均衡 网络架构
|
2月前
|
存储 容器
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
|
2月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
52 0
|
2月前
|
微服务 应用服务中间件
微服务跨域(通过网关配置进行跨域)
在单体架构中,我们通常通过SpringMVC配置类实现CORS跨域支持,设置允许的来源、请求头、方法及凭证等。然而,在微服务架构下,因浏览器首先访问网关再进行服务路由,需在网关配置跨域。对于无SpringMVC环境的网关(如使用Gateway组件),我们可在YAML文件中配置`spring.cloud.gateway.globalcors`属性,以实现全局跨域支持。
55 0