https://spring.io/projects/spring-cloud
一、SpringCloud Alibaba 1 SpringCloud Alibaba 简介 1.1 简介Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba
很多组件都停止服务
SpringClouid的几大痛点:
- SpringCloud部分组件停止维护和更新,给开发带来不便;
- SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制;
- SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba的优势:
- 阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用;
- 成套的产品搭配完善的可视化界面给开发运维带来极大的便利;
- 搭建简单,学习曲线低。
结合SpringCloud Alibaba我们最终的技术搭配方案:
- SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册)
- SpringCloud Alibaba- Nacos: 配置中心 (动态配置管理)
- SpringCloud - Ribbon: 负载均衡
- SpringCloud - Feign: 声明式HTTP客户端(调用远程服务)
- SpringCloud Alibaba - Sentinel: 服务容错(限流、降级、熔断)
- SpringCloud - Gateway: API 网关 (webflux 编程模式)
- SpringCloud - Sleuth:调用链监控
- SpringCloud Alibaba - Seata: 原Fescar, 即分布式事务解决方案
2 SpringCloud Alibaba - Nacos [作为注册中心]com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,他是使用 java 编写的,需要依赖 java 环境
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html
2.1 下载 nacos-serverhttps://github.com/alibaba/nacos/releases
2.2 启动 nacos-server-
cmd 运行startup.cmd 文件
-
访问localhost:8848/nacos/
-
使用默认的 nacos/nacos 登录
1、首先,修改 pom.xml 文件,引入 Nacos Discovery Starter
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
2、在应用的 /resource /application.properties 中配置 Nacos Server地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、使用@EnableDiscoveryClient 开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4、启动应用、观察 nacos 服务列表是否已经注册上服务
注意每一个应用都应该有名字,这样才能往册上去。修改applicaion.propertes文件
spring.application.name= service provider server.port=8000
5、注册更多的服务上去,测试使用 feign 远程
3 SpringCloud Alibaba - Nacos [作为配置中心] 3.1 pom.xml 引入 Nacos Config StarterNacos 使用三步
1、导包
2、写配置,指定 nacos 地址,指定应用的名字
3、开启服务注册发现功能 @EnableDiscoveryClient
3.2 在应用的 resource 下 bootstrap.propertiescom.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=127.0.0.1:88483.3 在 nacos 中添加配置 3.4 在应用中使用@Value 和 @RefreshScope
@RefreshScope // 刷新对应controller
@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);
}
bootstrap.properties 配置
spring.application.name=gulimall-coupon # 服务的名称 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # 服务注册地址 spring.cloud.nacos.config.namespace=ae34901c-9215-4409-ae61-c6b8d6c8f9b0 # 命名空间地址 #spring.cloud.nacos.config.group=111 # 对应分组 spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml # 配置集指定data_id spring.cloud.nacos.config.ext-config[0].group=dev # 配置集指定 group 分组 spring.cloud.nacos.config.ext-config[0].refresh=true # 是否动态刷新 在配置中心修改后 微服务自动刷新
/ ** * 1、使用 Nacos作为配置中心统一管理配置 * 1) 引入依赖 *二、SpringCloud 1 Feign 声明式远程调用 1.1 简介* * 2)在resources下创建一个 bootstrap.properties 文件 * spring.application.name=gulimall-coupon * spring.cloud.nacos.config.server-addr=127.0.0.1:8848 * 3)给配置中心默认添加一个配置集(Data ID) gulimall-coupon(当前应用名).properties,并添加所有配置 * 4)Controller上添加, @RefreshScope 动态获取配置 + @Value(${配置项名称}) 获取配置值 * 如果配置中心和当前应用配置文件中都配置了相同的项,优先使用配置中心的配置 * * 2、 细节 * 1)命名空间:配置隔离 * 默认:public(保留空间),默认新增的所有配置都在pulibc空间 * a. 开发、测试、生产:利用命名空间来做环境隔离 * 注意: 在 bootstrap.properties 配置上需要使用哪个命名空间下的配置 * spring.cloud.nacos.config.namespace=71adbb8e-f606-4d5c-9c0d-ee175abd7c89 * b. 每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置 * * 2)配置集:所有配置的集合 * * 3)配置集ID:类似文件名 * Data ID:类似文件名 * * 4)配置分组: * 默认所有的配置集都属于:DEFAULT_GROUP; * 1111,618,1212 * spring.cloud.nacos.config.group=1111 * * 每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod * * 3、 同时加载多个配置集 * 1)微服务任何配置信息,任何配置文件都可以放在配置中心中 * 2)只需要在 bootstrap.properties 说明加载配置中心中哪些配置文件即可 * 3) 以前SpringBoot任何方法从配置文件中获取值都能使用,如 @Value、@ConfigurationProperties * 注意:配置中心有的优先使用配置中心中的 */com.alibaba.cloud *spring-cloud-starter-alibaba-nacos-config *
Feign 是一个声明式的 HTTP 客户端,他的目的就是让远程调用更加简单。Feign提供了 HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好的 HTTP 请求参数、格式、地址等信息
Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显示地使用这两个组件。
SpringCloud Feign,在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloud Ribbon 自行封装服务调用客户端的开发量。
1.2 使用1、引入依赖
org.springframework.cloud spring-cloud-starter-openfeign
2、开启 feign 功能
@EnableFeignClients(basePackages = "com.xxx.gulimall.pms.feign") // 指定feign包位置
3、声明远程接口
@FeignClient("gulimall-ware")
public interface WareFeignService {
@PostMapping("/ware/waresku/skus")
public Resp> skuWareInfos(@RequestBody List skuIds)
}
总结
/ **
Feign 使用三步
1、导包 openfeign
2、开启 @EnableFeignClients 功能
3、编写接口,进行远程调用
* 1) 引入 Openfeign
* 2) 编写一个接口(放在feign包下),告诉 SpringCloud这个接口需要调用远程服务
* @FeignClient("gulimall-coupon")
* a. 声明接口的每一个方法都是调用哪个远程服务的哪个请求
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
3) 开启远程调用功能
@EnableFeignClients(basePackages = "com.wumiao.gulimall.member.feign")
2 Gateway
2.1 简介
网关作为流量的入口,常用功能包括路由转发,权限效验,限流控制等,而 SpringCloud GateWay作为 SpringCloud 官方推出的第二代网关框架,取代了 Zull 网关。
网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险、包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。
Spring Cloud GateWay 旨在提供一种简单有效的方式来对 API 进行路由,并为他们提供切面,例如:安全性、监控/指标 和弹性等
官网文档地址:https://spring.io/projects/spring-cloud-gateway
术语机翻:
- Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.
路由:网关的基本构建块。它由 ID、目标 URI、谓词集合和过滤器集合定义。如果聚合谓词为真,则匹配路由。- Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework ServerWebExchange. This lets you match on anything from the HTTP request, such as headers or parameters.
断言:这是一个 Java 8 函数断言。输入类型是 Spring Framework ServerWebExchange。这使您可以匹配来自 HTTP 请求的任何内容,例如标头或参数。- Filter: These are instances of GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.
过滤器:这些是使用特定工厂构建的 GatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
2.2 使用工作流程:
(1) 建module(gulimall-getway,同gulimall-coupon)
(2) 改pom
org.springframework.cloud spring-cloud-starter-gateway
(3)写yaml
- application.yml
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri: https://qq.com
predicates:
- Query=url,qq
- bootstrap.properties
spring.application.name=gulimall-gateway spring.cloud.nacos.config.server-addr=127.0.0.1:8848 #每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod spring.cloud.nacos.config.namespace=6257a9b4-1055-4f2d-adff-ccfab4d3d12d #spring.cloud.nacos.config.group=dev #spring.cloud.nacos.config.group=prod
(4)主启动
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) // 排除跟数据源你有关的配置
public class GulimallGetwayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGetwayApplication.class, args);
}
}



