spring-cloud-alibaba

一. 参考资料

1.学习视频

https://www.bilibili.com/video/BV1Mt4y1i7JW?p=1

https://www.bilibili.com/video/BV18E411x7eT?p=43

2.参考网站

2.1 版本选择

https://spring.io/projects/spring-cloud-alibaba

点击左边菜单 spring cloud/ spring cloud alibaba/ 可以看到稳定版本时2.2.1RELEASE版.

然后在https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

毕业版本依赖关系(推荐使用)中找到推荐使用的版本. 以此填写父pox.xml

2.2其他参考网址:

springboot集成 参见https://nacos.io/zh-cn/docs/quick-start-spring-boot.html 注意参考它的完整示例代码

nacos官网 https://nacos.io/zh-cn/docs/what-is-nacos.html

nacos下载https://github.com/alibaba/nacos/releases/tag/2.0.0-bugfix

 

二. 项目构架

注意事项1. model,vo修改了,需要通知其他项目对应修改

注意事项2. 启动顺序. 先启动单体项目, 然后启动schedule项目(预热和定时任务). 再启动web(权限相关的请求), 最后启动网关(最终提供服务), 服务之前可以相互调用,但是不要相互pom依赖(依赖了运维不方便)

 

1.所有项目依赖于common项目, common提供通用的配置, 如设置openfeign调用传递header中的登录信息,日志的配置

2.schedule定时器,同时提供缓存预热

3.单体项目,只提供接口,通过OpenFeign相互调用

4.web只提供权限认证,jwt与springsecurity.  jwt参见(https://blog.csdn.net/weixin_42552315/article/details/114536194)

5. gateway对外唯一暴露的接口(其他的只能通过内外ip访问), 转发规则不需要权限认证的直接转发到单体项目; 需要权限的转发到web项目

6.nacos服务治理,seata分布式事务.

7.sentinal提供流量控制 参见https://www.bilibili.com/video/BV1Mt4y1i7JW?p=9&spm_id_from=pageDriver

 

三. 知识点

openfeign的引入

1. pom.xml添加spring-cloud-starter-openfeign依赖;

2. 主启动类加@EnableFeignClients

3.接口加注解,参见CarClient

4. 负载均衡,默认是轮询; 如果要实现权重, 必须自己实现AbstractLoadBalancerRule类, 然后application.yml中加

provider:
ribbon:
  NFLoadBalancerRuleClassName: com.zcnet.wp.config.NacosWeightedRule

5. 设置超时时间(默认1秒),application.yml中加

ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000

6.openfeign调用传递header参数

A. filter获取本项目的userInfo, userInfo = request.getHeader("userInfo "); 并把userInfo 绑定到当前线程中; 这样本项目内到处都能获取到userInfo了

B. 写个拦截器TransmitUserInfoFeighClientIntercepter实现RequestInterceptor, 并配置为bean即可

@Slf4j
public class TransmitUserInfoFeighClientIntercepter implements RequestInterceptor {

   public TransmitUserInfoFeighClientIntercepter() {
  }

   @Override
   public void apply(RequestTemplate requestTemplate) {
       //从应用上下文中取出user信息,放入Feign的请求头中
       UserInfo user = ThreadContext.getUserInfo();
       if (user != null) {
           try {
               String userJson = JSONObject.toJSONString(user);
               requestTemplate.header("KEY_USERINFO_IN_HTTP_HEADER",
                       URLDecoder.decode(userJson,"UTF-8"));
          } catch (UnsupportedEncodingException e) {
               log.error("用户信息设置错误",e);
          }
      }
  }
}

---------------

@Configuration
public class EnableUserInfoTransmitterAutoConfiguration {
   public EnableUserInfoTransmitterAutoConfiguration() {
  }

   @Bean
   public TransmitUserInfoFeighClientIntercepter transmitUserInfo2FeighHttpHeader(){
       return new TransmitUserInfoFeighClientIntercepter();
  }

}

seata使用

1.依赖引入

<!--seata需要的 -->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
   <version>2.1.1.RELEASE</version>
</dependency>

2.设置代理数据源为项目的数据源

@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DruidDataSource druidDataSource() {
   return new DruidDataSource();
}

@Primary
@Bean
public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
   return new DataSourceProxy(druidDataSource);
}

3.model类中id指端必须写全注释

@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")
@Column(name = "id", unique = true, nullable = false)
private int id;


sentinal流量控制,降级处理(生产端)

  1. 流量控制一般使用直接限流即可

  1. 降级处理 (降级是指给纠错机会) --(窗口期时指多久后重新开张)

    rt模式: 从第一个超时开始算, 如果接下来1秒内的5个都超时,才抛异常. 5此纠错机会.

    异常比例: 每秒x%报错. (该版本有问题)

    异常数: 1分钟内异常数,注意窗口时间要大于60s

  2.  

1. 引入依赖

<!--sentinal流量控制,  spring-boot-starter-actuator是监听的-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
   <version>2.2.1.RELEASE</version>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 

2. yml配置配置监听路径和sentinal后台地址

#配置暴暴露地址, 去掉此段代码, 默认也会全部暴露 (这段可以不要)
management:
endpoints:
  web:
    exposure:
      include: *
     
# 配置后台地址
spring:
cloud:
  sentinel:
    transport:
      dashboard: localhost:8080

 

四. 项目约定

1. 获取请求用@GetMapping

2. 添加/修改用@PostMapping

3. 删除用@DeleteMapping

4. 如果还有其他的用@PutMapping (一般不用)

 

 

 

posted @ 2021-05-05 12:52  trump2  阅读(95)  评论(0)    收藏  举报