springcloud简介
基于springboot构建,通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。
SpringCloud的组件相当繁杂,拥有诸多子项目。重点关注Netflix
下面只简单介绍下经常用的5个
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
参考连接:
链接: SpringCloud的五大组件详解.
服务发现——Netflix Eureka
我们用EurekaClient 就必须用到图上@EnableDiscoveryClient/@EnableEurekaClient的两个注解之一,EnableEurekaClient 注解里面包含了EnableDiscoveryClient注解
@AutoWired
DisCoverClient disCoverClient=new DisCoverClient();// Eureka发现服务类
@AutoWired
RestTemplate restTempLate=new RestTemplate();//
List<ServiceInstance> serviceInstances=disCoverClient.getInstance("ServiceId");//服务名称
ServiceInstance instance=ServiceInsances.get(i);//服务序列号,获取到服务实例
Product product=restTempLate.getForObject(instance.getHost()+":"+instance.getPost()+"/project/"+pid,Product.class);//url,返回值
客服端负载均衡——Netflix Ribbon
策略名 | 策略描述 |
---|---|
RoundRobinRule | 轮询方式选择Server |
BestAvaliableRule | 选择最小并发数的Server |
RondomRule | 随机选择一个Server |
基于Feign实现服务调用
Feign默认集成了Ribbon,整合容错组件需要在配置文件中开发Feign对Hystrix/Sentinel的支持
@FeignClient(value="service-product" fallback=ProductFallback.class fallbackFactory=ProductServiceFallbackFactory.class)//value用于指定调用服务注册中心的哪个微服务;fallback 用于指定当前feign接口的容错类;实现FallbackFactory的容错获取异常
public interface ProductService{
@RequestMapping("/product/{pid}")//指定请求的uri部分,结合项目名成为完成的url
Product getByPid(@Pathvariable Integer pid);
/** 在service-order服务中调用service-product服务中的getByPid方法只需要用@Autowried ProductService即可。*/
}
Sentinel使用入门
tomcat默认线程数在200-400之间
// 自定义异常返回页面
@Component
public class ExceptionHandlerPage implements UriBlockHandler{
@Override
public void blocked(HttpServerletRequest request,HttpServerletResponse response, BlockException e) throw IOException{
ResponseData responseData=null;
//BlockException 一场接口,包含Sentinel的五个异常
//flowException 限流异常
//DegradeEeCeption 降级异常
//ParamFlowException 参数限流异常
//SystemBlockException 系统负载异常
if(e instanceof FlowException){
new ResponseData("接口被限流了");
} else if(e instanceof DegraeException){
new ResponseData("接口被降级了");
}
response.getWriter().write(JSON.toJSONString(responseData));
}
}