springcloud alibaba

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的配置文件:

member.user.name=dev-youngmall-member-zhangsan
member.user.age=22

访问:

 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

比如:

 配置文件分别为:

server.port=13000和server.port=12000
测试一下最后读取的配置是:youngmall-gateway.properties

 当删掉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错误

 到达时间后,可以访问

 

 待更。。。

参考文档:https://github.com/alibaba/spring-cloud-alibaba

原文地址:https://www.cnblogs.com/tdyang/p/12902524.html