什么是Spring Cloud?
Spring Cloud 是一个用于构建分布式系统的开源框架,Spring Cloud 提供了一系列工具和库,帮助开发者构建可伸缩、高可用、容错性强的分布式应用程序。Spring Cloud 的目标是简化分布式系统的开发,提供了一些常用的分布式系统模式和组件,如服务注册与发现、负载均衡、断路器、分布式配置等。
-
Spring Cloud Config(配置中心):
- Spring Cloud Config 允许您将应用程序的配置集中管理,可以存储在版本控制系统中或分布式配置仓库中(如Git)。
- 使用 Config Server 来提供配置信息,客户端应用可以通过Config Client从Config Server获取配置。
- 使用配置文件或配置中心中的属性来配置应用程序,支持不同环境的配置管理。
-
Spring Cloud Eureka(服务发现与注册):
- Eureka 是一个服务发现和注册中心,允许微服务应用注册自己,并查询其他服务的实例信息。
- 通过 Eureka 服务器和 Eureka 客户端来实现服务注册和发现。
- 通过在应用程序中添加
@EnableEurekaServer
或@EnableEurekaClient
注解来使用。 - 实例eureka注册中心的实现,eureka如何使用呢?
另外需要一个供应商provider和消费方consumer以eureka为服务者进行交互使用。provider注册信息到eureka中,consumer也将自己注册到eureka中,consumer通过获取provider发布的唯一id即服务名来获取服务。
①配置eureka的application.yml文件
②在启动类开启注解server: port: 10086 # 端口 eureka: client: service-url: # EurekaServer地址,多个地址以','隔开 defaultZone: http://localhost:10086/eureka instance: lease-expiration-duration-in-seconds: 10 # 10秒即过期 lease-renewal-interval-in-seconds: 5 # 5秒一次心跳 spring: application: name: eureka-service # 应用名称,会在Eureka中显示
@SpringBootApplication @EnableEurekaServer //开启eureka服务 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
-
Spring Cloud Ribbon(负载均衡):
- Ribbon 是一个客户端负载均衡器,可以将请求分发到多个微服务实例上,实现负载均衡。
- Ribbon 可以与 Eureka 集成,自动发现可用的服务实例。
- 通过添加
@LoadBalanced
注解来使用 Ribbon 的 RestTemplate 来调用服务。
①在启动类注入Rest Template交给spring容器管理,在使用时直接依赖注入@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
②在controller中使用restTemplate.getFroObject()方法
@RestController @RequestMapping("consumer") public class StuController { // feign中继承ribbon负载均衡的restTemplate @Autowired private RestTemplate restTemplate; @RequestMapping("findById/{sid}") public String findById(@PathVariable Integer sid) { // 使用restTemplate发起远程调用 Stu stu = restTemplate.getForObject("http://localhost:8081/provider/findId/" + id, Stu.class); return stu.toString(); }
③可以在消费者配置中更改默认的负载均衡规则来改变负载均衡规则,在消费者application.yml中加入,讲默认的RoundRobinRule轮询方式修改为RandomRule随机形式。
service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
-
Spring Cloud Hystrix(熔断器):
- Hystrix 是一个熔断器模式的库,用于防止分布式系统中的故障扩散。
- 它可以在服务出现故障时提供降级策略,防止服务雪崩。
- 使用
@HystrixCommand
注解来定义熔断器。 - 引入依赖<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
-
//@EnableCircuitBreaker //开启hystrix熔断
- 编写降级逻辑,并在该方法上添加注解@HystrixCommand(fallbackMethod = "defaultFallBack"),要注意,因为熔断的降级逻辑方法必须跟正常逻辑方法保证:相同的参数列表和返回值声明
// 全局方法编写降级逻辑 public String defaultFallBack() { return "网络中断,请稍后再试!"; }
-
Spring Cloud Feign(声明式REST客户端):
- Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
- Feign 可以与 Ribbon 集成,实现负载均衡的远程调用。
- 使用
@FeignClient
注解来创建一个声明式的客户端接口。
①开启熔断# 默认情况下是关闭的 feign: hystrix: enabled: true # 开启Feign的熔断功能
②在引导类中加入注解
@SpringBootApplication @EnableDiscoveryClient // 开启Eureka客户端 @EnableCircuitBreaker //开启hystrix熔断 @EnableFeignClients //开启feign注解 public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class,args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
③创建接口,该接口是feign的接口
//标注该类是一个feign接口 @FeignClient(value = "service-provider",fallback = StuFeignFullBack.class) public interface StuFeign { @GetMapping("/provider/findById/{sid}") Stu findById(@PathVariable Integer sid); }
④通过实现该接口来实现熔断功能
@Component public class StuFeignFullBack implements StuFeign { @Override public Stu findById(Integer sid) { Stu stu = new Stu(); stu.setName("feign中的fullback,网络中断,稍后再试"); return stu; } }
⑤通过注入feign接口调用方法实现功能
@RestController @RequestMapping("consumer") @DefaultProperties(defaultFallback = "defaultFallBack") public class StuController { @Autowired StuFeign stuFeign; @HystrixCommand public String findById(@PathVariable Integer sid) { Stu stu = stuFeign.findById(sid); return stu.toString(); } }
-
Spring Cloud Zuul
不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。Zuul就是我们服务的统一入口。
①导入依赖<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
②配置文件
server:
port: 10010 #服务端口
spring:
application:
name: api-gateway #指定服务名
③在启动类开启网关@EnableZuulProxy // 开启网关功能
④编写路由规则
#1 配置路由规则
zuul:
routes:
server-provider: # 路由名称一般和供应商服务名一致
path: /service-provider/** # 客户端的请求路径中包含service-provider. 这里是映射路径
url: http://localhost:8081 # 要转发的地址. 映射路径对应的实际url地址
#2 配置路由规则
zuul:
routes:
server-provider: # 路由名称一般和供应商服务名一致
service-id: service-provider # 指定服务名称
#3 配置路由规则
zuul:
routes:
server-provider: service-provider # 路由名称一般和供应商服务名一致
#4 不配置
⑤添加路由前缀prefix: /api # 添加路由前缀
⑥过滤器。Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。
@Component
public class LoginFilter extends ZuulFilter {
/**
* 过滤器类型,前置过滤器
pre:请求在被路由之前执行
route:在路由请求时调用
post:在route和errror过滤器之后调用
error:处理请求时发生错误调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤器的执行顺序,返回值越小优先级越高
* @return
*/
@Override
public int filterOrder() {
return 8;
}
/**
* 是否使用过滤器
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 自定义校验过滤器
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
return null;
}
}