官方地址:https://spring.io/projects/spring-cloud-alibaba
github:https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md
一、概述
* Spring Cloud alibaba为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。
* 有了Spring Cloud Alibaba,您只需要添加一些注释和少量配置,就可以将Spring Cloud的应用程序连接到阿里巴巴的分布式解决方案上,并利用阿里巴巴的中间件构建分布式应用系统。
主要功能
* 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
* 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
* 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
* 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
* 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
* 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
* 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
* 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
区分
二、创建阿里巴巴环境
1、创建空项目
输入名称:springCloudAlibaba
选择路径: E:\Java
2、创建父类
操作:选中空项目springCloudAlibaba->点击右键,选择 new-> module
名称:springcloudalibaba_parent
3、pom引入依赖
<!--继承父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--定义版本号-->
<properties>
<spring.cloud.version>Hoxton.SR6</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>
<!--维护依赖-->
<dependencyManagement>
<dependencies>
<!--springCloud 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud阿里巴巴依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
三、Nacos简介和下载
1、Nacos是什么
一个更易于构建云原生应用的动态服务发现、配置管理和 服务管理平台。
2、Nacos能干嘛
- 替代Eureka做服务注册中心
- 替代Config做服务配置中心
3、 安装Nacos
网址管理
github仓库地址:https://github.com/alibaba/nacos
nacos版本下载地址:https://github.com/alibaba/nacos/releases
文档:https://nacos.io/zh-cn/
手册:https://nacos.io/zh-cn/docs/what-is-nacos.html
安装nacos 博客教程:码农快乐盒的SpringCloudAlibaba-Nacos 2.2.1最新版教程
docker安装,待完善
1. windows安装
安装nacos 博客教程:码农快乐盒的SpringCloudAlibaba-Nacos 2.2.1最新版教程
2. liunx安装
3. 访问Nacos
路径:
http://localhost:8848/nacos/
用户名 :nacos 密码:nacos
4、 启动Nacos
win单机 启动:
startup.cmd -m standalone
win集群 启动: 双击nacos\bin\startup.cmd
liunx 单机启动:sh startup.sh -m standalone
liunx 集群启动:sh startup.sh
四、Nacos Client 开发
1、创建nacosclient Module
操作:右键springcloudalibaba_parent->new->module
名称:springbootalibaba_01nacosclient
pom.xml依赖
<dependencies>
<!--web依赖-->
<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>
</dependencies>
application.yml 配置
server:
port: 8989
spring:
application:
name: NACOSCLIENT # 微服务服务名,唯一 推荐大写
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos server 总地址
discovery: # 发现
server-addr: ${spring.cloud.nacos.server-addr} # 指定nacos client注册地址。默认是server地址,可写可不写
service: ${spring.application.name} # 指定nacos服务名。 默认是spring.application.name 地址可写可不写,如果写,以这个为主,建议不写
启动文件
路径:springbootalibaba_01nacosclient\src\main\java\com\xxx\NacosClientApplication.java
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //开始服务注册 这个注解可以省略不写
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
}
2、nacos细节和服务间的通信
1. 细节
指定nacos client注册地址:默认 ${spring.cloud.nacos.server-addr} 可不写
指定nacos服务名:默认 ${spring.application.name}可不写
server:
port: 8989
spring:
application:
name: NACOSCLIENT # 微服务服务名,唯一 推荐大写
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos server 总地址
discovery: # 发现
server-addr: ${spring.cloud.nacos.server-addr} # 指定nacos client注册地址。默认是server地址,可写可不写
service: ${spring.application.name} # 指定nacos服务名。 默认是spring.application.name 地址可写可不写,如果写,以这个为主,建议不写
2. 通信
1. 创建user module
名称:springcloudalibaba_02users
pom.xml 引入依赖
<dependencies>
<!--web依赖-->
<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>
</dependencies>
配置文件
server:
port: 8989
spring:
application:
name: USERS
cloud:
nacos:
server-addr: 127.0.0.1:8848
启动文件
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class, args);
}
}
启动后查看nacos
创建UserController
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@GetMapping("/invoke")
public String invokeProduct() {
log.info("用户服务。。。。");
return "调用用户服务成功!!!";
}
}
访问:http://127.0.0.1:8989/invoke
2. 创建product module
名称:springcloudalibaba_03products
pom.xml 引入依赖
<dependencies>
<!--web依赖-->
<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>
</dependencies>
server:
port: 9090
spring:
application:
name: PRODUCTS
cloud:
nacos:
server-addr: 127.0.0.1:8848
启动文件
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
启动后查看nacos
创建ProductController
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
private static final Logger log = LoggerFactory.getLogger(ProductController.class);
@Value("${server.port}")
private int port;
@GetMapping("/product")
public String product(Integer id) {
log.info("id:{}", id);
return "商品服务返回:" + id + " ,当前提供服务的端口号为:" + port;
}
}
访问:http://127.0.0.1:9090/product?id=21
3. 用户调用商品服务
user module 里面的pom引入openfign
<dependencies>
<!--web依赖-->
<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>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
user module UsersApplication 启动类添加开启注解
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class, args);
}
}
user module 添加FeignClient配置类
package com.xxx.feignClients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient("PRODUCTS")
public interface ProductClient {
@GetMapping("/product")
String product(@RequestParam("id") Integer id);
}
user module UserController 调用FeignClient配置类
package com.xxx.controller;
import com.xxx.feignClients.ProductClient;
import oracle.jrockit.jfr.openmbean.ProducerDescriptorType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private ProductClient productClient;
@GetMapping("/invoke")
public String invokeProduct() {
log.info("用户服务。。。。");
//调用商品服务
String result = productClient.product(1);
return result;
}
}
访问:http://127.0.0.1:8989/invoke
3. 统一配置中心使用及config client 开发及自动配置刷新
1. 创建 config client module
名称:springcloudalibaba_04configclient
pom 引入依赖
<dependencies>
<!--web依赖-->
<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>
</dependencies>
创建配置文件:src/main/resources/application.yml
server:
port: 8888
spring:
application:
name: CONFIGCLIENT
cloud:
nacos:
server-addr: 127.0.0.1:8848 # client 地址
创建启动文件:src/main/java/com/xxx/ConfigClientApplication.java
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
创建controller :src/main/java/com/xxx/controller/DemoController.java
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
private static final Logger log = LoggerFactory.getLogger(DemoController.class);
@GetMapping("/demo")
public String demo() {
log.info("demo ok !!!");
return "demo ok !!!";
}
}
访问:http://localhost:8888/demo
成功
配置文件配置userName:src/main/resources/application.yml
server:
port: 8888
spring:
application:
name: CONFIGCLIENT
cloud:
nacos:
server-addr: 127.0.0.1:8848 # client 地址
userName: xiaochen
DemoController 注入userName:src/main/java/com/xxx/controller/DemoController.java
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
private static final Logger log = LoggerFactory.getLogger(DemoController.class);
@Value("${userName}")
private String userName;
@GetMapping("/demo")
public String demo() {
log.info("demo ok !!!");
return "demo ok !!! userName:" + userName;
}
}
访问:http://localhost:8888/demo
发现当前取得是自己计算的登录的名称。不会取配置文件里面的值
修改配置文件配置userName:src/main/resources/application.yml
给userName加前缀
server:
port: 8888
spring:
application:
name: CONFIGCLIENT
cloud:
nacos:
server-addr: 127.0.0.1:8848 # client 地址
customer:
userName: xiaochen
修改DemoController 注入userName:src/main/java/com/xxx/controller/DemoController.java
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
private static final Logger log = LoggerFactory.getLogger(DemoController.class);
@Value("${customer.userName}")
private String userName;
@GetMapping("/demo")
public String demo() {
log.info("demo ok !!!");
return "demo ok !!! userName:" + userName;
}
}
访问:http://localhost:8888/demo
2. nocas页面添加配置
访问:http://localhost:8848/
操作:配置管理->配置列表->+
配置信息,点击右下角发布
成功后自动跳转到配置列表
3. 实现自动化配置
- 引入nacos config client依赖:
springcloudalibaba_04configclient\pom.xml
<!--nacos config client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 配置文件配置说明
application:直接拉取配置<拉取了文件,直接使用,检测到有文件就使用>
bootstrap:预先拉取<先拉取完成后,在使用,完全拉去完成后在使用>
3. 删除application.yml ,添加bootstrap.yml文件
删除application.yml ,创建:springcloudalibaba_04configclient\src\main\resources\bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # config server地址
group: DEFAULT_GROUP # 哪个组进行配置获取
name: configclient-prod # 文件名称
file-extension: yml #文件扩展名
- 配置文件比对
- 配置自动刷新:
src/main/java/com/xxx/controller/DemoController.java
@RefreshScope //允许配置修改自动刷新
- 不配置注解:页面修改后需要重启后才能更新。
- 配置注解:页面修改后自动刷新。
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope //允许短短配置修改自动刷新
public class DemoController {
private static final Logger log = LoggerFactory.getLogger(DemoController.class);
@Value("${customer.userName}")
private String userName;
@GetMapping("/demo")
public String demo() {
log.info("demo ok !!!");
return "demo ok !!! userName:" + userName;
}
}
4. 拉取配置两种方式及命名空间、组的使用
-
说明
-
命名空间创建
用于项目拆分。每个项目的配置文件相互隔离
路径:http://localhost:8848/nacos/#/namespace?serverId=center&group=&dataId=&namespace=undefined&namespaceShowName=undefined
路径:http://localhost:8848/nacos/#/namespace?serverId=center&group=&dataId=&namespace=undefined&namespaceShowName=undefined
路径:http://localhost:8848/nacos/#/configurationManagement?serverId=center&group=&dataId=&namespace=undefined&namespaceShowName=undefined&appName=&pageSize=&pageNo=
3. 组的使用
用来区分项目之间的服务
配置列表->点击命名空间ems->+
名称:configclient-dev.yml
分组:CONFIGCLIENT
配置文件:springcloudalibaba_04configclient\src\main\resources\bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # config server地址
group: CONFIGCLIENT # 哪个组进行配置获取
name: configclient-dev # 文件名称
file-extension: yml #文件扩展名
namespace: 48c471f1-6409-4048-b203-4cd4a257243c # 文件命名空间
配置文件说明
命名空间必须是命名空间ID
默认的public可以不配做命名空间
访问:http://localhost:8888/demo
5. 拉取配置的导入导出
选中要导出的配置,一键导出
删除当前配置
访问:http://localhost:8888/demo
报错
导入配置
导入成功页面
访问:http://localhost:8888/demo
3、nacos的mysql的持久化
1. windows 本地持久化
新建数据库
找到本地安装的nacos->conf->nacos-mysql.sql,本地myql表运行当前nacos-mysql.sqll文件
生成如下数据库表
编辑application.properties 文件
配置如下信息
重新启动nacos :startup.cmd -m standalone
访问:http://127.0.0.1:8848/nacos/#
,添加配置信息
修改配置文件:springcloudalibaba_04configclient\src\main\resources\bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # config server地址
group: DEFAULT_GROUP # 哪个组进行配置获取
name: configclient-dev # 文件名称
file-extension: yml #文件扩展名
# namespace: 48c471f1-6409-4048-b203-4cd4a257243c # 文件命名空间
访问demo:http://localhost:8888/demo
查看数据库,数据已经插入
2. windows 安装docker安装nacos
引用博客windows10下在docker容器里部署nacos
3. liunx 中nacos 持久化
4、nacos的集群搭建
1. 复制nacos为3份
2. 初始化mysql数据
为了数据彻底情况,把表全部删除, 重新导入
运行nacos\conf\nacos-mysql.sql
运行成功
原始数据
3. 配置nacos端口,集群
修改nacos、nacos01、nacos02 ->conf->cluster.conf.example
为cluster.conf
修改完成
编辑文件nacos、nacos01、nacos02 ->conf->cluster.conf
为如下内容
127.0.0.1:8840
127.0.0.1:8850
127.0.0.1:8860
编辑文件nacos、nacos01、nacos02 ->conf->application.properties
端口号为:
启动,在bin路径中输入cmd->回车->打开命令行
启动nacos : 不要有空格,点击回车
win单机 启动:
startup.cmd -m standalone
win集群 启动: 双击nacos\bin\startup.cmd
liunx 单机启动:sh startup.sh -m standalone
liunx 集群启动:sh startup.sh
访问
http://127.0.0.1:8840/nacos/#
http://127.0.0.1:8850/nacos/#
http://127.0.0.1:8860/nacos/#
查看端口8840 8850 8860 的节点
4. 启动测试
修改:springbootalibaba_01nacosclient\src\main\resources\application.yml
server:
port: 9002
spring:
application:
name: NOCASCLIENT
cloud:
nacos:
server-addr: http://127.0.0.1:8840/ # server 地址
discovery:
server-addr: http://127.0.0.1:8840/ # client
service: ${spring.application.name}-${spring.cloud.client.ip-address}:${server.port}
查看:http://127.0.0.1:8840/nacos/#
下的服务列表
查看:http://127.0.0.1:8850/nacos/#
http://127.0.0.1:8860/nacos/#
下的服务列表 没有同步
五、Nginx 实现Nacos高可用
六、Sentinel
Sentinel 简单使用:https://blog.youkuaiyun.com/qq_41538097/article/details/124330640
下载dashboard:https://github.com/alibaba/Sentinel/releases
dashboard启动命令:java -jar -Dserver.port=9191 sentinel-dashboard-1.8.5.jar
dashboard访问:http://localhost:9191/#/dashboard
1. Dashboard 安装
-
运行命令
找到所在目录->路径中输入cm->enter
弹出命令窗口
输入命令
默认端口号:8080
java -jar -Dserver.port=9191 sentinel-dashboard-1.8.5.jar
- 访问:
http://localhost:9191/#/dashboard/home
2. Sentinel 项目创建
1. 新建module Sentinel
名称:springcloudalibaba_05sentinel
2. 配置 pom.xml
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos client 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
3. 配置application
server:
port: 8998 # 端口
spring:
application: #application
name: SENTINEL #配置名称
cloud:
nacos: # nacos 配置服务地址
server-addr: 127.0.0.1:8840
sentinel:
enabled: true # 开启 sentinel 保护
transport:
dashboard: 127.0.0.1:9191 # 链接 dashboard web端口
port: 8719 # 与dashboard通信的端口 tcp端口 默认的端口
4. 添加 启动类
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SentinelApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelApplication.class, args);
}
}
5. 创建controller
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
private static final Logger log = LoggerFactory.getLogger(DemoController.class);
@GetMapping("/demo")
public String demo() {
log.info("demo ok........");
return "demo ok........";
}
}
6. 访问
路径:http://localhost:8998/demo
7. 访问Dashboard
路径:http://localhost:9191/#/dashboard/metric/SENTINEL
8. 吞吐概念
3. Sentinel 规则
七、整合
1. 创建空项目
名称:springCloudAlibabaIntegration
2. 创建父moudle
名称:springcloud_alibaba_parent
pom
<!--parent-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<properties>
<spring.cloud.version>Hoxton.SR6</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<!--维护依赖-->
<dependencies>
<!--spring.cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3. 创建工具类moudle
名称:spinrgcloud_alibaba_commons
4. 创建用户服务moudle
名称:springcloud_alibaba_users
pom
<dependencies>
<!--web-->
<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>
</dependencies>
application
server:
port: 8888
spring:
application:
name: USERS
cloud:
nacos:
server-addr: 127.0.0.1:8840
启动类
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class, args);
}
}
controller
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@GetMapping("/invoke")
public String invokeProduct() {
log.info("user invoke ok !!" );
return "user invoke ok !!";
}
}
访问:http://localhost:8888/invoke
5. 创建商品服务moudle
名称:springcloud_alibaba_products
pom
<dependencies>
<!--web-->
<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>
</dependencies>
application
server:
port: 9999
spring:
application:
name: PRODUCTS
cloud:
nacos:
server-addr: 127.0.0.1:8840
启动类
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProductsApplication {
public static void main(String[] args) {
SpringApplication.run(ProductsApplication.class, args);
}
}
controller
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
private static final Logger log = LoggerFactory.getLogger(ProductController.class);
@Value("${server.port}")
private int port;
@GetMapping("/product")
public String product() {
log.info("product ok !! 当前服务的端口为:" + port);
return "product ok !! 当前服务的端口为:" + port;
}
}
访问:http://localhost:9999/product
6. 用户服务调用商品服务 RestTemplate 废弃
- 用户添加配置类:
springcloud_alibaba_users\src\main\java\com\xxx\config\BeansConfig.java
package com.xxx.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class BeansConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 用户控制器调用:
springcloud_alibaba_users\src/main/java/com/xxx/controller/UserController.java
package com.xxx.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private RestTemplate restTemplate;
@GetMapping("/invoke")
public String invokeProduct() {
log.info("user invoke ok !!");
String str = restTemplate.getForObject("http://PRODUCTS/product", String.class);
return "user invoke ok !! 获取商品数据:" + str;
}
}
访问:http://localhost:8888/invoke
7. 用户服务调用商品服务 openFeign 使用
- user module -> pom 引入openFeign
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- user 启动类开启openFeign服务
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启openFeign的调用
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class, args);
}
}
- user 创建openFeign服务的接口类
package com.xxx.feignclients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient("PRODUCTS")
public interface ProductClient {
@GetMapping("/product")
String product();
}
- user controller openFeign方式调用商品服务
package com.xxx.controller;
import com.xxx.feignclients.ProductClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private RestTemplate restTemplate; //restTemplate方式调用
@Autowired
private ProductClient productClient;//openfeign 方式调用
@GetMapping("/invoke")
public String invokeProduct() {
//String str = restTemplate.getForObject("http://PRODUCTS/product", String.class);
String str = productClient.product();
log.info("获取商品数据:{}", str);
return "user invoke ok !! 获取商品数据:" + str;
}
}
- 访问:
http://localhost:8888/invoke
8. 用户服务调用商品服务 Sentinel
- user module -> pom 引入sentinel
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- application 配置sentinel
server:
port: 8888
spring:
application:
name: USERS
cloud:
nacos:
server-addr: 127.0.0.1:8840 # nacos 地址配置
sentinel:
enabled: true # 开启通信
eager: true # 取消控制台懒加载,立即生效
transport:
port: 8719 # 端口号,默认
dashboard: 127.0.0.1:9191 # dashboard地址配置
- 重启user服务,查看sentinel服务台
路径:http://localhost:9191/#/dashboard/flow/USERS
9. 创建网关moudle
名称:springcloud_alibaba_gateway
pom 引入依赖
<dependencies>
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
启动类
package com.xxx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
application 配置文件
server:
port: 8990
spring:
application:
name: GATEWAY
cloud:
nacos:
server-addr: 127.0.0.1:8840 # nacos 路径
gateway:
routes:
- id: users_route
uri: lb://USERS # user路径 原路径:http://localhost:8888 负载均衡:lb://USERS
predicates:
- Path=/invoke
- id: product_route
uri: lb://PRODUCTS # product路径 原路径: http://localhost:9999 负载均衡:lb://PRODUCTS
predicates:
- Path=/product
启动服务访问Nacos:http://127.0.0.1:8840/nacos/index.html#
访问:http://localhost:8990/product
访问:http://localhost:8990/invoke
10. nacos 实现user统一配置
路径:http://127.0.0.1:8840/nacos/index.html#
1. nacos 新建命名空间
2. nacos 查看命名空间列表
3. nacos web添加配置
配置列表->final->+
配置->发布
user配置文件如下
server:
port: 8888
spring:
application:
name: USERS
cloud:
nacos:
server-addr: 127.0.0.1:8840 # nacos 地址配置
sentinel:
enabled: true # 开启通信
eager: true # 取消控制台懒加载,立即生效
transport:
port: 8719 # 端口号,默认
dashboard: 127.0.0.1:9191 # dashboard地址配置
发布成功,查看配置列表
4. users服务 pom添加nacos config client依赖
<!--nacos config client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
5. users服务添加bootstrap.yml预加载配置
路径:springcloud_alibaba_parent\springcloud_alibaba_users\src\main\resources\bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8840 # 远端配置中心是谁
namespace: e0aae3f6-6328-489c-85e4-de935b880a49
group: USERS # 哪个组进行配置获取
name: users-prod # 文件名称
file-extension: yml #文件扩展名
6. 访问user接口
路径:http://localhost:8888/invoke
11. nacos 实现GATEWAY统一配置
1. nacos web添加配置
配置列表->final->+
配置列表->final->+
配置->发布
配置文件如下
server:
port: 8990
spring:
application:
name: GATEWAY
cloud:
nacos:
server-addr: 127.0.0.1:8840 # nacos 路径
gateway:
routes:
- id: users_route
uri: lb://USERS # user路径 原路径:http://localhost:8888 负载均衡:lb://USERS
predicates:
- Path=/invoke
- id: product_route
uri: lb://PRODUCTS # product路径 原路径: http://localhost:9999 负载均衡:lb://PRODUCTS
predicates:
- Path=/product
发布成功,查看配置列表
2. GATEWAY服务 pom添加nacos config client依赖
<!--nacos config client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3. GATEWAY服务添加bootstrap.yml预加载配置
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8840 # 远端配置中心是谁
namespace: e0aae3f6-6328-489c-85e4-de935b880a49
group: GATEWAY # 哪个组进行配置获取
name: gateway-prod # 文件名称
file-extension: yml #文件扩展名
4. 访问user接口
路径:http://localhost:8990/invoke