简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
文档:https://github.com/alibaba/spring-cloud-alibaba
为什么使用 SpringCloudAlibaba

SpringCloud 的几大痛点
SpringCloud 部分组件停止维护和更新,给开发带来不便;
SpringCloud 部分环境搭建复杂没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用 SpringCloud
Alibaba 的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来极大的便利搭建简单,学习曲线低。
结合 SpringCloud Alibaba 我们最终的技术搭配方案:
版本选择
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟SpringBoot 版本号一致的版本:
整体架构图

如何使用?
首先我们要在 gulimall-common 中添加 SpringCloud Alibaba 的依赖,此时要查看官方文档选择适配的版本


在 gulimall-common 工程中,添加如下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.8.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
项目整体重新导入即可
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用 java 编写。需要依赖 java 环境。
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.htm
首先把服务注册发现依赖,放入 common 的 pom.xml 中
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
然后我们来下载 nacos-server 即 nacos 服务中心
https://github.com/alibaba/nacos/releases
下载完后进行解压,双击 startup.cmd 其中注册中心

发现启动失败,因为高版本默认是集群启动

修改 startup.cmd 文件,设置其为单机启动模式

在 批处理文件中 rem 表示注释
在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

使用 @EnableDiscoveryClient开启服务注册发现功能 @SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

启动服务,在网页中进行查看

浏览器中输入: http://localhost:8848/nacos/#/login

输入默认账号密码:nacos、nacos

发现没有服务,我们需要配置服务名

重跑项目刷新网页,有此服务上线

我们接着再把 gulimall-member 服务注册进来
Nacos 使用三步:
1、导包 nacos-discovery
2、写配置,指定 nacos 地址,指定应用的名字
3、开启服务注册发现功能@EnableDiscoveryClient
测试使用 feign 远程调用
Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显式地使用这两个组件。
SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了SpringCloudRibbon 自行封装服务调用客户端的开发量。
A、Feign的依赖我们在创建项目时已导入

B、编写 Controller 中方法
调用优惠券服务。。

C、引入远程调用
想要远程调用别的服务
1)引入 open-feign
2)编写一个接口,告诉 SpringCloud 这个接口需要调用别的远程服务
(1)声明接口的每一个方法都是调用哪个远程服务的那个请求
3)开启远程调用功能
首先在 member 模块创建远程调用接口的存放包名,然后在包内创建接口 CouponFeignService,在其中编写代码。

接下来在启动类上加上 @EnableFeignClients 开启远程调用

D、测试
首先编写member模块 Controller 类中测试方法

然后重新启动俩个服务,地址栏输入路由回车,出现以下则查询成功


Nacos 作为配置中心来管理配置
首先在 common 中导入配置中心的相关依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>

在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据,这个配置文件是SpringBoot 规定的,会优先于 application.properties 来加载

先从本地来获取配置,在 application.properties 中先写相关测试变量,然后写测试方法获取


可正常获取到本地配置

然后从配置中心动态获取配置,因为要在项目中修改配置需要将项目重新打包部署,太麻烦了
首先新建配置,将本地配置的内容 copy 过来进行修改。


发布配置后如图

在相应 Controller 上加入 @RefreshScope 注解

即可动态获取配置中心修改的值

命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group 或Data ID的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
默认:public(保留空间),默认新增所有配置都在 public


修改项目命名空间:

开发、测试、生产,利用命名空间来做环境隔离,当然也可以每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己的命名空间下的配置

总之,通过命名空间我们可以根据开发环境进行隔离,也可以根据各个微服务进行隔离。
配置集:
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

类似文件名,即 Data Id
配置分组:
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如Buy 或Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如database_url 配置和 MQ_topic 配置。
默认所有的配置集都属于:DEFAULT_GROUP
不同场景下使用不同分组的配置,比如双11、平时、618

加载多配置集
配置文件中对数据源的相关配置、框架相关配置进行拆分成多个配置文件,便于维护。




配置文件集成

注意:配置中心的内容优先本地配置
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而 SpringCloud Gateway 作为 SpringCloud 官方推出的第二代网关框架,取代了 Zuul 网关。
网关性能对比:

网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。Spring Cloud Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等。
官方文档地址: https://spring.io/projects/spring-cloud-gateway/
思考:
为什么使用 API 网关?
API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性。
使用 API 网关后的优点如下:
路由
路由是网关最基础的部分,路由信息有一个 ID、一个目的URL、一组断言和一组Filter 组成。如果断言路由为真,则说明请求的 URL 和配置匹配
断言
Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是Spring5.0 框架中的ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等。
过滤器
一个标准的 Spring webFilter。Spring cloud gateway 中的 filter 分为两种类型的 Filter,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 将会对请求和响应进行修改处理
工作原理

客户端发送请求给网关,弯管 HandlerMapping 判断是否请求满足某个路由,满足就发给网关的 WebHandler。这个 WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会执行所有过滤器的 pre 方法。请求到达目标服务处理之后再依次执行所有过滤器的 post 方法。
一句话:满足某些断言 (predicates) 就路由到指定的地址 (uri) ,使用指定的过滤器 (filter)
首先,我们来创建网关模块


同样的,也是要依赖 common 工程

把 gulimall-gateway 模块添加到根模块中,还要修改 SpringBoot 与 SpringCloud 版本信息,与其他模块一致

然后,开启网关服务的注册与发现

配置注册中心地址

同时加入配置中心的配置文件


启动服务,记得排除数据库相关的数据源

配置路由规则:
