Spring cloud Alibaba+Spring Boot+nacos
- Spring Cloud Alibaba引用版本
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- springboot引用版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> <relativePath/> <!-- lookup parent from repository --> </parent>
- Nacos-Windows版本:nacos-server-2.1.1
- spring-cloud-starter-openfeign依赖spring-cloud-starter-loadbalancer
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
a.小提示:在SpringBoot 2.4.x的版本之后,对于bootstrap.properties/bootstrap.yaml配置文件(我们合起来成为Bootstrap配置文件)的支持,需要导入如下的依赖
,参考连接:https://blog.csdn.net/GCTTTTTT/article/details/126660215
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.0.4</version> </dependency>
- spring cloud alibaba是Spring Cloud的子项目,所以使用也需要在各个组件中引用spring cloud,下面是其中一个组件gulimall-coupon的pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-coupon</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gulimall-coupon</name> <description>谷粒商城-优惠券服务</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>2021.0.4</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.4.0</version> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- gulimall-common为公共组件,因为被其他组件共同使用,所以为公共.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>gulimall</artifactId> <groupId>com.atguigu.gulimall</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>gulimall-common</artifactId> <description>每个微服务公共依赖,比如bean或工具类</description> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.14</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> <scope>compile</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>io.renren</groupId> <artifactId>renren-fast</artifactId> <version>3.0.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.0.4</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
- 在公共组件中引入spring-cloud-starter-alibaba-nacos-discovery,在application.yml中引入nacos服务器地址:
spring: datasource: username: root password: 123456 url: jdbc:mysql://192.168.1.7:3306/gulimall_sms driver-class-name: com.mysql.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
- 在主启动类启用nacos注解@EnableDiscoveryClient,然后启动服务.
- 登录nacos网站http://127.0.0.1:8848/nacos/index.html#/login,用户名密码均为nacos,在服务管理->服务列表中查看发现并上线的服务.列表中显示的服务名是application.yml中指定的application:name名
- 创建组件时每个组件都已经引入feign,可以远程调用,这里先在gulimall-member中编写一个CouponFeignService接口:
package com.atguigu.gulimall.member.feign; import com.atguigu.common.utils.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient("gulimall-coupon") public interface CouponFeignService { @RequestMapping("/coupon/coupon/member/list") public R membercoupons(); }
@FeignClient("gulimall-coupon")是Feign注解必须的,gulimall-coupon表示要远程调用那个服务,调用coupon服务中的那个请求?可以直接复制coupon服务中的请求代码,这里是@RequestMapping("/coupon/coupon/member/list") public R membercoupons();
11. 然后再member服务主启动类添加注解@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
扫描带注解的包
12. 测试访问请求:http://localhost:8000/member/member/coupons
使用ncos配置中心
- 首先common组件引入maven包
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2.新增src\main\resources\bootstrap.properties配置文件,配置 Nacos server 的地址和应用名
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=127.0.0.1:8848 #spring.cloud.nacos.config.refresh-enabled=true #spring.cloud.nacos.config.enable-remote-sync-config=true
在application.properties中配置键值
coupon.user.name=zhangsan2 coupon.user.age=18
这里的参数值可以通过@Value注解获得
@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); }
写在配置文件中的参数修改需要重启应用,使用nacos无需重启应用,登录http://localhost:8848/nacos/index.html#,
配置管理->配置列表->新建配置,
Data Id就是配置文件中的应用名:spring.application.name=gulimall-coupon
3. 然后在control中需要请求的类中添加注解@RefreshScope
然后测试访问:
命名空间管理
Nacos 基于Namespace 帮助用户逻辑隔离多个命名空间,这可以帮助用户更好的管理测试、预发、生产等多环境服务和配置
创建好命名空间后,先选择命名空间,再创建配置:
最后在bootstrap.properties中指定prop的命名空间ID值spring.cloud.nacos.config.namespace=1b64f1ec-e3aa-46ff-9e7e-107618bae01d
- 也可以基于每个组件服务配置单独的命名空间配置管理
- 可以在不同的命名空间下创建分组:
注意在配置文件中不同的分组要在同一命名空间下,否则不生效.
*2023.4.25日追加:如果想在服务管理服务列表中按照命名空间划分配置,需要配置--spring.cloud.nacos.discovery.namespace=prod --spring.cloud.nacos.discovery.group=test
prod为命名空间,test为group.
将所有配置写在nacos上,我们注释掉本地的配置application.yml
#spring: # datasource: # username: root # password: 123456 # url: jdbc:mysql://192.168.1.7:3306/gulimall_sms # driver-class-name: com.mysql.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
将以上配置写在nacos上,首先指定spring.cloud.nacos.config.namespace=a84ad...
,这是将coupon的配置全部写在coupon命名空间里的配置中
然后在bootstrap.properties中继续填nacos具体的配置如下:
spring cloud gateway
小提示:目前使用的的gateway版本是3.1.4,gateway中集成了org.springframework.boot:spring-boot-starter-webflux:2.6.6,这和spring-boot-starter-web会出现冲突,如果出现冲突,根据错误提示反馈:Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency
,我测试了第一种方法有效,在application.properties中添加spring.main.web-application-type=reactive
- gateway组件先不使用数据库,所以主启动类先不启用数据库连接类,否则报错无法连接数据库
/*开启服务注册发现*/ @EnableDiscoveryClient @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class ,}) public class GulimallGatewayApplication { public static void main(String[] args) { SpringApplication.run(GulimallGatewayApplication.class, args); } }
- gateway功能之一:Query路由断言接受两个参数:一个必需的参数和一个可选的regexp(这是一个Java正则表达式)。配置查询路由断言(谓词)的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
访问测试http://localhost:88/hello?url=qq 如果请求连接中包含url=qq的查询参数,那么就会跳到https://www.qq.com/hello上.
参考连接:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories中的5.9. The Query Route Predicate Factory章节
- ES6 Promise 对象示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> </head> <body> <script> //1、查出当前用户信息 //2、按照当前用户的id查出他的课程 //3、按照当前课程id查出分数 // $.ajax({ // url: "mock/user.json", // success(data) { // console.log("查询用户:", data); // $.ajax({ // url: `mock/user_corse_${data.id}.json`, // success(data) { // console.log("查询到课程:", data); // $.ajax({ // url: `mock/corse_score_${data.id}.json`, // success(data) { // console.log("查询到分数:", data); // }, // error(error) { // console.log("出现异常了:" + error); // } // }); // }, // error(error) { // console.log("出现异常了:" + error); // } // }); // }, // error(error) { // console.log("出现异常了:" + error); // } // }); // 1、Promise可以封装异步操作 /* let p = new Promise((resolve, reject) => { //1、异步操作 $.ajax({ url: "user.json", success: function (data) { console.log("查询用户成功:", data) resolve(data); }, error: function (err) { reject(err); } }); }); //这里的的obj是上面成功传过来的data,用resolve将成功的数据往下传,reject将失败的数据往下传 p.then((obj) => { return new Promise((resolve, reject) => { $.ajax({ url: `user_corse_${obj.id}.json`, success: function (data) { console.log("查询用户课程成功:", data) resolve(data) }, error: function (err) { reject(err) } }) }) }).then((data)=>{ console.log("上一步的结果",data) $.ajax({ url: `corse_score_${data.id}.json`, success: function (data) { console.log("查询课程得分成功:", data) resolve(data) }, error: function (err) { reject(err) } }) })*/ function get(url, data) { return new Promise((resolve, reject) => { $.ajax({ url: url, data: data, success: function (data) { resolve(data); }, error: function (err) { reject(err) } }) }); } get("user.json") .then((data) => { console.log("用户查询成功~~~:", data) return get(`user_corse_${data.id}.json`); }) .then((data) => { console.log("课程查询成功~~~:", data) return get(`corse_score_${data.id}.json`); }) .then((data)=>{ console.log("课程成绩查询成功~~~:", data) }) .catch((err)=>{ console.log("出现异常",err) }); </script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)