很实用的Spring Cloud总结

spring cloud 是一款基于spring boot的云应用分布式服务框架,它和阿里的dubbo不同,因为spring cloud 类似于全家桶全套式的分布式服务框架。
在我是使用spring cloud框架过程中,使用的开发工具为IDEA,因为毕竟spring boot项目在IDEA上能更好,更快的开发。
我在spring cloud的过程中用到的组件有:

服务与发现

发现(Feign/Ribbon)和注册(Eureka),其中发现Feign/Ribbon里面做好了负载均衡的配置,都是基于注解。Ribbon中是实例RestTemplate类,这个类里面已经做好了负载均衡的配置。而Feign是用注解@EnableFeignClients这个注解表示开启负载均衡,在Service层用@FeignClient(服务名)来指定哪个服务,一般是用于服务消费,譬如你有A服务,B服务。在B服务中需要调用A服务(即B作为服务提供者,A作为服务消费者),获取结果,进行下一步动作,这个时候你可以使用resttemplate,也可以使用feign来写。然后注册中心,这个我也自己搭建过,其中注意的是,注册中心的配置文件中,有一个eureka.client.register-with-eureka=false是eureka是否自己注册自己,这个一定要加,不加会抛异常,原因自己也查过,原因就是自己注册自己的时候自己还没有启动。注册中心可以搭建集群并且相互注册,在注册的时候配置文件中只需要用逗号分开就行。

断路器

会考虑到“雪崩”问题,有一个服务出现问题的话,调用这个服务的服务就会产生堵塞,大量请求的话会导致服务瘫痪。所以用到了spring cloud中的断路器,它默认是5秒20次。有两种方法,一种是Ribbon中使用断路器,除了加依赖之外,还需要在启动类上加@EnableHystrix注解表示注解开启,在方法上面加注解@HystrixCommand(fallbackMethod=“备用方法名”)。另外一种是Feign中使用断路器,这个更简单,只需要在@FeignClient注解里面加上备用方法类名,这个类实现这个接口,重写里面的方法就行了。这个需要注意,虽然Feign自带断路器,但是默认是没有打开的,需要在配置文件中开启。我用的主要就是Fegin里面自带的断路器。还有一个问题,在刚开始我在做自己的微服的时候,调用其他微服时直接用的IP,这样是无法起到负载均衡的作用,应该用服务名,它才会根据自己的算法去选择具有该服务名称的服务。
行。

断路器聚合监控

Hystrix Turbine将每个服务断路器的数据进行了整合,Hystrix Turbine的使用非常简单,只需要引入相应的依赖和加上注解和配置就可以了。配置完成之后启动服务,输入指定的Hystrix Turbine网址就会显示出对应的各个断路器的视图进行监控。

Zuul

还有一个组件是智能路由Zuul,默认和Ribbon结合实现了负载均衡的功能,它不但可以有路由的作用还可以做过滤的作用,一般用它做一些安全验证,需要继承ZuulFilter这个类重写它的方法,我们的具体逻辑写在run()这个方法里面比如去请求到底有没有权限访问等。

配置中心Config

Spring cloud有统一的配置中心Config,配置管理开发工具包它包含了客户端Client和服务端Server两个角色,服务提供配置文件的储存,用接口的形式将配置文件的内容提供出去,客户通过接口获取数据并且初始化。Spring cloud默认Git存放配置文件,我们使用的是svn。这个其中要注意的是,修改完配置后客户端获取的还是旧消息。其实spring cloud给我们了一个解决方案,除了加依赖,就是每个客户端通过POST方法触发各自的/refresh,需要给变量的类上面加@RefreshScope。Config就是为了解决所有微服务各自维护各自的配置,设置一个统一的配置中心,方便修改配置的。

Bus

Spring Cloud的Bus是因为config修改完配置后各个结点都要refresh才能生效实在太麻烦,所以交给bus来通知服务节点刷新配置的。目前spring cloud bus支持RabbitMq和Kafka。

接下来说一下遇到的问题总结:

  • 使用过程中应注意版本的兼容性问题。
  • 命名一定要规范,注意不要有关键字。
  • 在使用Spring Cloud的Ribbon或者Feign来服务调用时,机器和网络的环境很重要,不然会出现第一次调用超时,而后续就没有问题了。这个问题也能解决,造成这个原因是因为Ribbon进行客户端负载均衡是Client并不是在服务启动的时候就创建好的,而是在调用的时候才会去创建,这种背景之下很容易超时。可以这样解决,让RibbonClient提前创建(调用之前),也是在配置文件中修改参数。
  • 因为很多微服务,用Feign互相调用,在开发过程中,多个人开发同一个微服务时发现,如果用同一个注册中心,那么只能有一个服务实例,因为服务名不能重复,如果修改服务名,注册多个实例,又会影响到其他服务的调用,因为其他服务不知道这个服务名被修改了。所以我们必须每个人自己本地的注册中心。
  • 还有配置文件书写时服务名称时尽量用横线—而不是下划线_。
  • 在使用Zuul转发请求时没有带上cookie,导致Session不能共享,不配置它是默认Cookie被拦截掉的,需要加上配置。
  • Eureka的配置中心一般都是关闭自我保护的。
  • 假设有一个服务 A0, 它的context-path为 /A/0,有一个以Zuul作为reverse proxy的服务, 它配有A0的routes,为: A0: /A/0/**.此时,如果要通过reverse proxy来访问A0,则需要输入 /A/0/A/0。
  • 使用配置中心的时候,必须区分驼峰命名和中划线命名,统一化。
  • 开发过程中不要用开发工具Idea自带的JRE(1.8)。
  • Feign暂不支持复杂对象作为一个参数
  • @FeignClient所在的接口中,不支持@GetMapping等组合注解
  • 再用Ribbon做负载均衡使用RestTemplate时,想要获得一个List,应该用数组接收,而不应该直接用List。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值