1. SpringCloud Alibaba简介
1)简介
Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过Spring Coud编程模型轻松使用这些组件来开发分布式应用服务。
依括Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba
2)SpringCloud相关
SpringCloud的几大痛点
- SpringCloud部分组件停止维护和更新,给开发带来不便;
- SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
- Springcloud配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba的优势:
- 阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
- 成套的产品搭配完善的可视化界面给开发运维带来极大的便利
- 搭建简单,学习曲线低。
结合Springcloud Alibaba我们最终的技术搭配方案:
- SpringCloud Alibaba-Nacos:注册中心(服务发现/注册)
- SpringCloud Allbaba-Nacos:配置中心(动态配置管理)
- SpringCloud-Ribbon:负载均衡
- SpringCloud-Feign:声明式HTTP客户端(调用远程服务)
- SpringCloud Alibaba-Sentinel:服务容错(限流、降级、熔断)
- SpringCloud-Gateway:API 网关(webflux编程模式)
- SpringCloud-Sleuth:调用链监控
- Springcloud Alibaba-Seata:原Fescar,即分布式事务解决方案
3)版本选择
由于Spring Boot 1和Spring Boot 2在Actuator模块的接口和注解有很大的变更,且spring-cloud-commons从1.xx版本升级到2.0.0版本也有较大的变更,因此我们采取跟SpringBoot 版本号一致的版本:
·1.5.x版本适用于Spring Boot 1.5.x
·2.0.x版本适用于Spring Boot 2.0.x
·2.1.x版本适用于Spring Boot2.1.x
4)项目中的依赖
在common项目中引入如下,进行统一管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、SpringCloud Alibaba-Nacos[作为注册中心]
nacos-server-1.3.0.zip
链接:https://pan.baidu.com/s/1zFSmlTO7drbxsZPFmi-GCA
提取码:wnzu
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用java编写。需要依赖java环境。
Nacos 文档地址:https://nacos.io/zh-cn/docs/quick-starthtml
1)、下载nacos-server
htps://github.com/alibaba/nacos/releases
2)、启动nacos-server
·双击bin中的startup.cmd文件
·访问 http:/localhost:8848/nacos/
·使用默认的nacos/nacos 进行登录
3)、将微服务注册到nacos中
1. 首先,修改pom.xml文件,引入Nacos Discovery Starter。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 在应用的/src/main/resources/application.yml 配置文件中配置Nacos Server地址 + application.name
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.1.11:3308/zxmall_sms
driver-class-name: com.mysql.cj.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: zxmall-coupon
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
server:
port: 7000
3. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
package com.zx.zxmall.coupon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//开启服务注册发现的客户端
@EnableDiscoveryClient
@SpringBootApplication
public class ZxmallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(ZxmallCouponApplication.class, args);
}
}
4. 启动应用,观察nacos 服务列表是否已经注册上服务
注意:每一个应用都应该有名字,这样才能注册上去。
修改application.properties文件
spring.application.name=service-provider
server port=8000
注:
5. 注册更多的服务上去,测试使用feign 远程调用
Nacos 使用三步
- 1、导包nacos-discovery
- 2、写配置,指定nacos地址,指定应用的名字
- 3、开启服务注册发现功能@EnableDiscoveryClient
Feign 使用三步
- 1、导包openfeign
- 2、开启@EnableFeignClients功能
- 3、编写接口,进行远程调用
注:
3、SpringCloud Alibaba-Nacos[作为配置中心]
如何使用nacos作为配置中心统一管理配置
1.引入依赖(此处需要添加版本,不添加版本依赖添加失败,无法加载配置中心更新的配置项,控制台也不会输出配置的相关信息)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
2.创建一个bootstrap.properties
spring.application.name=zxmall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3.需要给配置中心默认添加一个叫数据集(Data id)zxmall-coupon.properties 默认规则:应用名.properties
4.给应用名.properties添加任何配置
5.动态获取配置
@RefreshScope:动态获取并刷新配置
@Value("${配置项的名}"): 获取到配置
@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(){
System.out.println(name);
System.out.println(age);
return R.ok().put("name",name).put("age",age);
}
}
如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置
注:
4. 进阶
核心概念
命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group或DatalD的配置。Namespace的常用场景之一是不同环境的配置的区分隔高,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
配置集:
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置集ID:
Nacos 中的某个配置集的ID。配置集ID是组织划分配置的维度之一。DatalD通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。DatalD通常采用类Java包(例如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
配置分组:
Nacos中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如Buy或Trade)对配置集进行分组,从而区分DatalD相同的配置集。当您在Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULTGROUP。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如database_url配置和
MQ_topic 配置。
1.命名空间:配置隔离
默认:public(保留空间);默认新增的所有配置都在public空间
1.开发、测试、生产 利用命名空间来做环境隔离
注意:在bootstrap.properties 配置上需要使用按个命名空间下的配置
spring.cloud.nacos.config.namespace=a722648f-41a5-42de-b814-4981229063db
spring.application.name=zxmall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=76f870df-ad21-4e35-ae22-ccc28662d6f4
spring.cloud.nacos.config.group=dev
2.每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
2.配置集:所有的配置的集合
3.配置集ID:类似文件名
新建配置中的Data ID: 类似配置文件名
4.配置分组
默认所有的配置集都属于: DEFAULT_GROUP
1111,618,1212
每个微服务创建自己的命名空间,使用配置分组区分环境 dev test prop
3.同时加载多个配置集
1.微服务任何配置信息,任何配置文件都可以放在配置中心中,这样就只需要一个bootstrap.properties
2.只需要在bootstrap.properties说明加载配置中心中那些配置文件即可
spring.application.name=zxmall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=76f870df-ad21-4e35-ae22-ccc28662d6f4
spring.cloud.nacos.config.group=prop
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=others.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
3.@Value @ConfigurationProperties..
以前springboot任何方法从配置文件中获取值都能使用
默认规则:配置中心有的优先使用配置中心的值
5. Gateway
1. 简介
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloud gateway作为SpringCloud官方推出的第二代网关框架,取代了Zuul网关。
网关提供APl全托管服务,丰富的APl管理功能,辅助企业管理大规模的APl,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。
Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标和弹性等。
官方文档地址:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/
创建zxmall-gateway模块
package com.zx.zxmall.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 1.开启服务注册发现
* 配置nacos的注册中心地址
*/
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class ZxmallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZxmallGatewayApplication.class, args);
}
}
路由相关配置
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