目录
前言
如果基础跟得上,框架的入门和使用其实不会太难,基本上都是以下步骤
引入依赖
编写配置
开启功能
类中使用
不过框架使用越简单,原理、实现就越难,一般开发人员可以先使用,再研究
本文简单介绍一下Spring Cloud netflix派的组件和使用
Eureka注册中心
简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。 Eureka
Server提供服务注册服务,各个节点启动后,会在Eureka
Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka
Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。 在应用启动后,将会向Eureka
Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka
Server将会从服务注册表中把这个服务节点移除(默认90秒)。 Eureka
Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka
Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
依赖
<!-- Eureka服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
关键注解
启动类注解:
@EnableEurekaServer 开启服务端功能
@EnableDiscoveryClient 开启客户端发现功能
部分配置
server配置:
server:
port: 10086
spring:
application:
name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
register-with-eureka: false # 不注册自己
fetch-registry: false #不拉取服务
client配置:
server:
port: 8081
spring:
application:
name: user-service # 指定应用名称,将来会作为服务的id使用
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
示例
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
// 根据服务id(spring.application.name),获取服务实例列表
List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
// 取出一个服务实例
ServiceInstance instance = instances.get(0);
// 查询
User user = restTemplate.getForObject(instance.getUri()+"/user/" + id, User.class);
return user;
}
}
Ribbon负载均衡
简介
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix
Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用
依赖
因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖
关键注解
启动类上加注解:
@EnableFeignClients
类上加注解:
@FeignClient(“服务名”)
在RestTemplate的配置方法上添加@LoadBalanced注解
部分配置
ribbon:
ReadTimeout: 2000 # 数据通信超时时长
ConnectTimeout: 500 # 连接超时时长
MaxAutoRetries: 0 # 当前服务器的重试次数
MaxAutoRetriesNextServer: 1 # 重试多少次服务
OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试 如果是false代表只对get请求重试
示例
RestTemplate的负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
调用方式
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
String url = "http://user-service/user/" + id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
Feign服务调用
简介
Feign 的英文表意为“假装,伪装,变形”,
是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做
Feign中集成了Ribbon、Hystrix
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
关键注解
启动类上:
@EnableFeignClients
客户端类上:
@FeignClient(“user-service”)
示例
客户端类
@FeignClient("user-service")
public interface UserClient {
@GetMapping("/user/{id}") //这里的返回结果和 url地址一定要和提供方保持一致
User queryById(@PathVariable("id") Long id);
}
调用处
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private UserClient userClient;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
return userClient.queryById(id);
}
}
Hystrix熔断降级
简介
Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
关键注解
启动类注解:
@EnableCircuitBreaker
@SpringCloudApplication可代替以下三个注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
降级–服务提供方
接口方法上添加注解,fallbackMethod 值为降级的接口
@HystrixCommand(fallbackMethod = “queryByIdFallBack”)
熔断的降级逻辑方法必须跟正常逻辑方法保证:相同的参数列表和返回值声明
类上添加注解
在类上指明统一的失败降级方法,fallbackMethod 的值为降级的接口
@DefaultProperties(defaultFallback= “defaultFallback”)
defaultFallback方法不需要参数
方法上加@HystrixCommand
熔断–服务调用方
接口方法加注解
@HystrixCommand
部分配置
circuitBreaker:
requestVolumeThreshold: 10 #触发熔断的最小请求次数,默认10
sleepWindowInMilliseconds: 10000 #休眠时长,默认是10000毫秒
errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%
示例
被调用方降级
方法上
@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryByIdFallBack")
public String queryById(@PathVariable("id") Long id){
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryByIdFallBack(Long id){
log.error("查询用户信息失败,id:{}", id);
return "对不起,网络太拥挤了!";
}
类上
@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "defaultFallBack")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
@HystrixCommand
public String queryById(@PathVariable("id") Long id){
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String defaultFallBack(){
return "默认提示:对不起,网络太拥挤了!";
}
}
调用方熔断
@GetMapping("{id}")
@HystrixCommand
public String queryById(@PathVariable("id") Long id){
if(id == 1){
throw new RuntimeException("太忙了");
}
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
Zuul服务网关
简介
Zuul是Spring Cloud全家桶中的微服务API网关。
所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
关键注解
启动类上:
@EnableZuulProxy // 开启Zuul的网关功能
部分配置
zuul server
server:
port: 10010 #服务端口
spring:
application:
name: api-gateway #指定服务名
zuul:
routes:
user-service: /user-service/** # 这里是映射路径
参考
https://github.com/Netflix/eureka
https://github.com/Netflix/ribbon
https://github.com/OpenFeign/feign
https://github.com/Netflix/hystrix
https://github.com/Netflix/zuul