分布式组件-P2-SpringCloudAlibaba
0.分布式组件
结合 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, 即分布式事务解决方案
SpringCloud Alibaba使用
引入时,注意两个版本号匹配
引入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.Nacos-注册、配置中心
1.1注册中心
1.1引入依赖
在common模块
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.2配置Nacos地址
下载Nacos Server:https://github.com/alibaba/nacos/releases
在 application.properties 中配置 Nacos server 的地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
1.3@EnableDiscoveryClient注解
package com.jq.gulimall.coupon;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@MapperScan("com.jq.gulimall.coupon.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
单击启动Nacos
startup.cmd -m standalone
1.2配置中心
1.2.1引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1.2.2添加配置
/src/main/resources/bootstrap.properties
gulimall-coupon:当前服务的名字
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
1.2.3Nacos进行配置
在对应controller上面添加注解,接口动态刷新修改完配置的文件
@RefreshScope //动态获取,并刷新配置
@Value("${配置项的名,例如user.name}") //获取application.properties中的值
优先使用Nacos配置中心的配置
1.3配置中心细节
1.3.1命名空间
用于进行租户粒度的配置隔离。 不同的命名空间下, 可以存在相同的 Group 或 Data ID 的配置。 Namespace 的常用场景之一是不同环境的配置的区分隔离,
例如
- 开发测试环境
- 生产环境的资源(如配置、 服务) 隔离等
- 可以进行每个微服务之间相互隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的配置
在bootstrap.properties进行配置,是public还是dev,还是pro的配置
spring.cloud.nacos.config.namespace=spring.cloud.nacos.config.namespace=(命名空间的唯一id值,看下图)
1.3.2配置集
一组相关或者不相关的配置项的集合称为配置集。 在系统中, 一个配置文件通常就是一个配置集, 包含了系统各个方面的配置。
例如, 一个配置集可能包含了数据源、 线程池、 日志级别等配置项
1.3.3配置集 ID:
Nacos 中的某个配置集的 ID。 配置集 ID 是组织划分配置的维度之一。
Data ID 通常用于组织划分系统的配置集。 一个系统或者应用可以包含多个配置集, 每个配置集都可以被一个有意义的名称标识。
Data ID 通常采用类 Java 包( 如com.taobao.tc.refund.log.level) 的命名规则保证全局唯一性。 此命名规则非强制
1.3.4配置分组:
Nacos 中的一组配置集, 是组织配置的维度之一。 通过一个有意义的字符串( 如 Buy 或Trade ) 对配置集进行分组, 从而区分 Data ID 相同的配置集。
当您在 Nacos 上创建一个配置时, 如果未填写配置分组的名称, 则配置分组的名称默认采用 DEFAULT_GROUP。 配置分组的常见场景: 不同的应用或组件使用了相同的配置类型, 如 database_url 配置和MQ_topic 配置
在bootstrap.properties进行配置
spring.cloud.nacos.config.group= 设置的Group名称
1.3.5加载多个配置文件
- datasource.properties
- mybatis.properties
将application.yml中所有配置拆分交给Nacos进行管理
在bootstrap.properties进行配置
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=a7f396db-27e4-49c0-8cf6-1b79b486886f
#spring.cloud.nacos.config.group=prod
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=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
2.OpenFeign调用远程服务
2.1简介
Feign 是一个声明式的 HTTP 客户端, 它的目的就是让远程调用更加简单。 Feign 提供了 HTTP
请求的模板, 通过编写简单的接口和插入注解, 就可以定义好 HTTP 请求的参数、 格式、 地
址等信息。
Feign 整合了 Ribbon(负载均衡) 和 Hystrix(服务熔断), 可以让我们不再需要显式地使用这
两个组件。
SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持, 在其实现下, 我
们只需创建一个接口并用注解的方式来配置它, 即可完成对服务提供方的接口绑定。 简化了
SpringCloudRibbon 自行封装服务调用客户端的开发量。
2.2使用
2.2.1引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2定义方法-在服务coupon里面
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
2.3远程调用,member服务调用coupon中方法membercoupons
- 引入open-feign依赖
- 编写接口,告诉SpringCloud这个接口需要调用远程服务
声明接口的每一个方法都是调用哪个远程服务的哪个请求
开启远程调用功能
package com.jq.gulimall.member.feign;
import com.jq.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();
}
开启远程调用功能,启动类上加@EnableFeignClients
注解
package com.jq.gulimall.member;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages ="com.jq.gulimall.member.feign")
@EnableDiscoveryClient
@MapperScan("com.jq.gulimall.member.dao")
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
3.GayewayAPI网关
3.1简介
网关作为流量的入口, 常用功能包括路由转发、权限校验、限流控制等。而 springcloud gateway作为 SpringCloud 官方推出的第二代网关框架, 取代了 Zuul 网关。
3.2为什么使用 API 网关?
API 网关出现的原因是微服务架构的出现, 不同的微服务一般会有不同的网络地址, 而外部
客户端可能需要调用多个服务的接口才能完成一个业务需求, 如果让客户端直接与各个微服
务通信, 会有以下的问题:
- 客户端会多次请求不同的微服务, 增加了客户端的复杂性。
- 存在跨域请求, 在一定场景下处理相对复杂。
- 认证复杂, 每个服务都需要独立认证。
- 难以重构, 随着项目的迭代, 可能需要重新划分微服务。 例如, 可能将多个服务合并成一个或者将一个服务拆分成多个。 如果客户端直接与微服务通信, 那么重构将会很难实施。
- 某些微服务可能使用了防火墙 / 浏览器不友好的协议, 直接访问会有一定的困难。
3.3使用
3.3.1创建gateway模块
3.3.2开启服务注册发现
package com.jq.gulimall.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
3.3.3配置Nacos注册中心地址
spring.application.name=gulimall-gateway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
server.port=88
3.3.4配置Nacos配置中心地址
bootstrap.properties
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=071b81ba-f206-496b-9db2-2c29ba77190e