springcloud alibaba主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
springboot 2.2.6,jdk1.8
1》Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
1服务注册与发现:
1、导包,pom.xml
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2、配置文件,application.yml或application.properties ,将当前微服务注册到nacos中
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
或
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、使用 @EnableDiscoveryClient 注解开启服务注册与发现功能,启动类中添加,例如
@EnableDiscoveryClient @SpringBootApplication public class YoungmallOrderApplication { public static void main(String[] args) { SpringApplication.run(YoungmallOrderApplication.class, args); } }
4、启动 Nacos Server
先去下载:https://github.com/alibaba/nacos/releases,这里下载1.2.1版本
运行
打开管理页面:http://192.168.42.1:8848/nacos/index.html#/login
账号和密码都是:nacos
可以看到服务管理:
5、启动微服务,刷新nacos管理页面,服务发现列表里就有一个服务
给服务起名字:
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: youngmall-order #注册到nacos中的服务名
demo:
两个服务:会员和优惠券,会员远程调用优惠券服务,获取会员拥有优惠的信息
进行上述配置后,pom.xml加入feign进行接口调用
导包:pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
youngmall-coupon:被调用的方法
@RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @RequestMapping("/member/list") public R findMemberCoupon(){ CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponType(1); couponEntity.setNote("超级优惠"); return R.ok().put("coupon",couponEntity); }
youngmall-member:远程调用接口和调用接口的方法
远程接口:
//指定哪个服务
@FeignClient("youngmall-coupon")
public interface CouponFeignServrice {
//远程服务的完整接口
@RequestMapping("coupon/coupon/member/list")
R findMemberCoupon();
}
youngmall-member:
@RestController @RequestMapping("member/member") public class MemberController { @Autowired private MemberService memberService; @Autowired private CouponFeignServrice couponFeignServrice; //调用远程接口,返回数据 @RequestMapping("/coupon") public R getCoupon(){ R r = couponFeignServrice.findMemberCoupon(); return r; }
测试:
流程:
youngmall-memeber调用远程接口的方法findMemberCoupon(),
远程接口上的注解@FeignClient("youngmall-coupon")找到在nacos中对应的服务,
方法上指定的完整路径区调用服务中对应的方法,最后完成调用。
2配置中心:
以前读取文件配置参数是从properties读取,如数据库的一些参数配置,这样读取的一个劣势就是当项目已经部署后
每次修改这里面的参数之后,就要重新将项目打包后发布,当项目很多又有集群部署的时候就会很麻烦,
使用nacos config可以在管理页面进行修改并发布,这样操作就会简单。
1、导包:pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、创建配置文件,官方建议是创建bootstrap.properties,这个文件会在application.yml之前读取
基础配置参数
spring.application.name=youngmall-member
spring.cloud.nacos.config.server-addr= 192.168.42.1:8848
3、测试:
//每次修改参数后会自动刷新
@RefreshScope
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
private CouponFeignServrice couponFeignServrice;
@Value("${youngmall-member.user.name}")
String userName;
@Value("${youngmall-member.user.age}")
int age;
@RequestMapping("/getPara")
public R getPara(){
return R.ok("从配置中心获取的参数:userName:"+userName+",age:"+age);
}
4、登录nacos server管理页面:
在配置管理中添加配置:点击加号
访问:
更多配置:
1.命名空间:
1.1做项目的环境隔离:dev,test,prod等环境
dev命名空间下,创建各个微服务的参数
bootstrap.properties配置文件:
spring.application.name=youngmall-member spring.cloud.nacos.config.server-addr=192.168.42.1:8848 #命名空间id #spring.cloud.nacos.config.namespace=5523a150-87ea-4c41-826d-c2c50d1ca805
测试:dev命名空间下的youngmall-member的配置文件:
访问:
1.2、不同的微服务之间的环境隔离和配置文件的读取
2、配置分组:我们还可以通过分组来进行一个微服务环境的隔离,例如:
bootstrap.properties配置文件:
spring.application.name=youngmall-member spring.cloud.nacos.config.server-addr=192.168.42.1:8848 #命名空间id spring.cloud.nacos.config.namespace=47704579-b637-4c2e-86f0-779678859d87 #配置分组 spring.cloud.nacos.config.group=prod
测试:youngmall-member命名空间下的dev分组的youngmall-member配置文件:
member.user.name=youngmall-member-prod-zhangsan
member.user.age=23
访问:
还可以根据分组做不同的事情,如不同的节假日,商品做不同的活动:
!在data id 为bootstrap.properties中的spring.application.name的值时或者值.properties都可以进行读取配置
spring.application.name=youngmall-gateway spring.cloud.nacos.config.server-addr=192.168.42.1:8848 spring.cloud.nacos.config.namespace=c241a49c-b096-4207-9e6a-9548ff2500a7
比如:
配置文件分别为:
当删掉youngmall-gateway.properties配置文件时,他就会读取youngmall-gateway配置。
3、配置集:
有时候我们需要读取不同的配置文件,如db.properties,application,logback.xml等等,这个时候就需要配置集了。
示例:读取application.yml文件,项目里的不再写东西了
在nacos管理平台:在命名空间下为youngmall-gateway下新增配置
application.yml配置类型
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: youngmall-gateway server: port: 18000
bootstrap.properties
spring.application.name=youngmall-gateway spring.cloud.nacos.config.server-addr=192.168.42.1:8848 spring.cloud.nacos.config.namespace=c241a49c-b096-4207-9e6a-9548ff2500a7 spring.cloud.nacos.config.extension-configs[0].dataId=application.yml spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP spring.cloud.nacos.config.extension-configs[0].refresh=true
启动:
2》Gateway:网关,流量的入口,用来路由转发,权限校验,限流等功能,用来取代第一代网关zuul
三个专业术语:
- Route: 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 aggregate predicate is true.
- Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework
ServerWebExchange
. This allows developers to match on anything from the HTTP request, such as headers or parameters. - Filter: These are instances Spring Framework
GatewayFilter
constructed in with a specific factory. Here, requests and responses can be modified before or after sending the downstream request.
要访问路由时,先要进行检查过滤操作,就像servlet的过滤器拦截器差不多,满足条件后,才让你访问路由。
简单使用:
1、pom.xm导包,nacos的包也导入。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
2、application.yml配置:这次采用配置集配置
bootstrap.properties配置还是一样:
spring.application.name=youngmall-gateway spring.cloud.nacos.config.server-addr=192.168.42.1:8848 spring.cloud.nacos.config.namespace=c241a49c-b096-4207-9e6a-9548ff2500a7 spring.cloud.nacos.config.extension-configs[0].dataId=application.yml spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP spring.cloud.nacos.config.extension-configs[0].refresh=true
就在application.yml添加关于gateway路由的操作:这是其中的一个策略
spring: cloud: gateway: routes: - id: query_route uri: https://www.qq.com predicates: - Query=url,qq nacos: discovery: server-addr: 127.0.0.1:8848 application: name: youngmall-gateway server: port: 18000
它的意思就是在请求地址是url=qq时,跳转到 https://www.qq.com网页
predicates:
- Query=url,qq
predicates接受一个数组,可以有很多条件,同时还可以进行正则匹配
例如:输入url=q时,就可以跳转到https://www.qq.com网页
predicates:
- Query=url,q.
这种规则还有很多,官网提供了不同的规则来满足不同的需求:
再试一个规则:After Route Predicate Factory
The After
Route Predicate Factory takes one parameter, a datetime
(which is a java ZonedDateTime
). This predicate matches requests that happen after the current datetime.
在时间到了之后才可以进行访问:这个感觉可以做抢购秒杀这样的需求。
application.yml,加上一个规则:
spring: cloud: gateway: routes: - id: query_route uri: https://www.qq.com predicates: - Query=url,qq - After=2020-05-24T10:42:00.866+08:00[Asia/Shanghai] nacos: discovery: server-addr: 127.0.0.1:8848 application: name: youngmall-gateway server: port: 18000
在未到时间时,报404错误
到达时间后,可以访问
待更。。。