【SpringCloud】学习笔记(补充)

阅读课程源码

3-5. 搭建与配置 Eureka 服务注册中心

添加spring-cloud-starter-eureka依赖时,需先在<dependencyManagemenr>节点中添加spring-cloud-dependencies(因为spring-boot-dependencies没有仲裁cloud的版本,注意版本号与当前工程的spring-boot-dependencies版本的对应关系,否则可能启动报错),并在<repostories>节点中添加https://repo.spring.io/libs-milestone(因为在Maven仓库没有springCloud的组件)

5-2. Ribbon实现客户端负载均衡

同一个服务的多个提供者的application.name必须一样(在eureka注册中心能看到这个应用名对应有几个提供者及它们的信息),这样消费者才能在使用restTemplate调用时url参数传这个应用名(而不是服务地址),并使用ribbon实现负载均衡消费。

5-3. Ribbon负载均衡策略

Ribbon默认是轮询策略RoundRobinRule,建议改为重试策略RetryRule。
我们可以使用@Bean注册一个策略bean(IRule的实现类)来覆盖掉默认策略。
我们还可以自定义IRule的实现类,从而实现自定义负载均衡策略。

ribbon:
	NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
    ConnectTimeout: 500 #请求连接超时时间
  	ReadTimeout: 1000 #请求处理的超时时间
  	OkToRetryOnAllOperations: true #对所有请求都进行重试
  	MaxAutoRetriesNextServer: 2 #切换实例的重试次数
  	MaxAutoRetries: 1 #对当前实例的重试次数

注意:
ribbon.OkToRetryOnAllOperations:是否所有请求都重试,false(默认值):只有get重试,true:get和post都会重试,需要关注接口幂等性因素。

5-4. Rest 请求模板类解读

6-2. Hystrix 快速入门

@SpringCloudApplication上有元注解:

  • @SpringBootApplication
  • @EnableDiscoveryClient(比@EnableEurekaClient更通用,支持eureka、consol、zookeeper)
  • @EnableCircuitBreaker(@EnableHystrix等效于它,因为它是@EnableHystrix的元注解)。

注意:@EnableCircuitBreaker@HystrixCommand@SpringCloudApplication都是出现在服务消费者上的。

6-4. Hystrix 的服务降级

其实那个熔断时的回调方法fallback,也就是降级方法。

6-5. Hystrix 的异常处理

默认情况下,运行有@HystrixCommand注解的方法时,消费者本身代码发生异常,或者在调用远程服务时提供者发生异常,都会触发降级方法,且降级方法中的throwable参数都能拿到异常信息,即使是提供者发生的异常!
自定义 Hystrix 请求的服务异常熔断:即不使用@HystrixCommand注解的形式。
HystrixCommand的run()方法对应标有@HystrixCommand注解的方法,getFallback()方法对应降级方法,getExecutionException()方法返回值对应降级方法中的throwable参数。
在controller中就可以直接new一个自定义的HystrixCommand子类,然后调用其execute()方法(注解形式是调用标有@HystrixCommand注解的方法)进行同步调用,并接收返回值即可!或者调用其queue()方法进行异步调用,并接收返回的Future即可!
com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(HystrixCommandGroupK ey.Factory.asKey(""))是HystrixCommand的构造参数setter,案例中固定传这个值。

6-6. Hystrix 仪表盘监控

访问消费者提供的/actuator/hystrix.stream接口之前,要先访问它的任意一个(使用到了hystrix的)其他接口。
仪表盘页面中,url输入消费者提供的/actuator/hystrix.stream接口地址,title可以取任意名字,一般取消费者工程名。

7-1. Feign 是什么

Spring Cloud对Feign进行了增强,使Feign支持了SpringMVC的注解,并整合了Ribbon和Eureka。
消费者不再使用RestTemplate+@LoadBalance方式,而是使用声明式的web服务客户端定义方式:只需要创建接口,使用@FeignClient指定服务名,使用@RequestMapping指定服务路由就可以。

7-2. 使用 Feign 实现消费者

从cloud的F版本开启,建议使用spring-cloud-starter-openfeign,因为feign停止维护了,且openfeign支持SpringMVC的注解。
理论上不需要引入hystrix依赖了,但是若启动时报错说找不到某些hystrix相关的类,就需要引入hystrix。
消费者的主类上要有@SpringCloudApplicatin和@EnableFeignClients。
声明一个标有@FeignClient("{提供者的应用名}")注解的接口,一般是xxxService,然后接口中声明标有@RequestMapping("{提供者的服务接口路径}")注解的方法即可!注意controller中注入xxxService时,idea会报红提示xxxService没有实现类,不用在意,可修改为不报红只报黄。

7-3. 使用 Feign 实现消费者的测试

补充:使用feign怎么选择负载均衡策略(默认是轮询策略)?也是像Ribbon一样注册一个IRule的bean就行,因为feign其实不是做负载均衡的,负载均衡是ribbon的功能,feign只是集成了ribbon而已,但是负载均衡的功能还是feign内置的ribbon再做,而不是feign。
feign的作用的替代RestTemplate,性能比较低,但是可以使代码可读性很强。
补充:注册Feign提供的Logger.Level的bean,设置Fegin-Client的输出日志级别。

8-2. 使用 Zuul 构建 API 网关

8-3. 使用 Zuul 进行请求过滤

路由:即根据客户端的请求路径进行转发请求到对应的服务中。

几种filterType:

  • pre:在路由之前执行过滤器,用于认证授权、选择源服务地址等
  • route:用于把Request路由到对应的服务
  • post:返回Response后执行,用于对Response结果进行修改,收集统计数据以及把Response传输会客户端。
  • error:
  • static:
@Component
public class AuthFilter extends ZuulFilter {
	@Override
	public Object run() throws ZuulException {
	    //这是Zuul包中的RequestContext,参考https://blog.csdn.net/haha7289/article/details/54312043/
	    RequestContext ctx = RequestContext.getCurrentContext();
	    HttpServletRequest request = ctx.getRequest();
	    String token = request.getParameter("token");
	    if (token == null) {
	        //表示不对该请求进行路由,参考https://blog.csdn.net/zgyjk/article/details/81672830
	        ctx.setSendZuulResponse(false);
	        ctx.setResponseStatusCode(401);
	        ctx.addZuulResponseHeader("content-type","text/html;charset=utf-8");
	        ctx.setResponseBody("非法访问");
	    }
	    //这个 run 方法的返回值目前暂时没有任何意义,可以返回任意值。为啥?
	    return null;
	}
}

8-4. Zuul 的路由规则

如果映射规则我们什么都不写:即连简化写法都不写。Zuul会为Eureka上所有注册的服务创建默认的路由规则:{Zuul服务的访问根路径}/{注册的服务的applicationName}/{注册的服务的接口的RequestMapping}。
如果要忽略为某些服务创建默认的路由规则(即不对外开放的服务),可以在yml文件配置zuul.ignored-services={applicationName1},{applicationName2}

通过浏览器上http://localhost:3721/application/dev/master访问config-server时,会根据config-server的application.properties 中配置的git 仓库信息,登录对应git仓库,去master分支中对应子目录下找application.yml(默认配置文件,每次都会找)和application-dev.yml配置文件,将它们的信息返回给访问者,当然还会通过 git clone 命令将远程配置文件在本地临时目录也保存一 份。

8-5. Zuul的异常处理

第2种方式不能禁止zuul 默认的SendErrorFilter,是因为它会调用容器中ErrorController接口的实现类的方法?

//通过Zuul包中的RequestContext可以获取异常信息!且一定是ZuulException类型。
ZuulException exception = (ZuulException)ctx.getThrowable();

第2种方法好处是:只需要重写ErrorController的getErrorPath()方法,返回一个路径(一般是访问全局error页面的路径),就可以重定向到这个路径了。

9-3. 构建 Springcloud config 配置中心仓库

window系统,能在控制台看到将Git上的远程配置文件都clone一份到C:/Users/xxx/AppData/Local/Temp/目录下了。

9-4. 构建 Springcloud config 配置中心客户端

Controller中的@Value("${url}"):从本config-client工程的bootstrap.properties中{config.url}对应的配置中心中获取{application+profile+label}对应的配置文件,再读取其中的url配置项的值,并注入过来!

补充:configClient配置的uri和discovery方式比较
spring.cloud.config.discovery.enabled: 开启配置信息发现。
spring.cloud.config.discovery.serviceId: 指定配置中心的service-id,便于扩展为高可用配置集群。

9-7. Springcloud config 的安全保护

若config-server的application.properties 中配置了用户名和密码,则访问它都需要进行该认证。所以config-client的bootstrap.properties(注意这里不是application.properties 了)中必须配置与server一致的用户名和密码,
补充-bus
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=bus-refresh

需要热加载的bean需要加上@RefreshScope注解,当配置发生变更的时候可以在不重启应用的前提下完成bean中相关属性的刷新。经由@RefreshScope修饰的bean将会被RefreshScope代理。参考https://blog.csdn.net/weixin_40318210/article/details/87954179。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值