当前位置: 首页 > Linux

SpringCloud学习(二)

时间:2023-04-07 01:51:14 Linux

第一部分已经搭建了基础demo。接下来继续搭建项目,介绍和描述springcloud组件。Eureka:其实每个服务的生命周期都是贯穿整个流程的。每个服务都要注册到Eureka服务器上,这里注册到Eureka上的服务也叫Client。Eureka通过心跳判断服务是否正常。Eureka只做请求转发。同时Eureka支持集群!!!Zuul:类似于网关,反向代理。为外部请求提供统一入口。Ribbon/Feign:可以理解为客户端调用服务。Hystrix:断路器,服务调用通常很深,一个底层服务通常为多个上层服务提供服务,那么如果底层服务出现故障,会造成大面积故障,Hystrix调用后会触发定义的处理方法fails,这样更友好的错误解决方案。它也是微服务的一种容错机制。这是eureka的结构图。用户和电影服务已经在第一部分注册。接下来使用ribbo和feign实现负载均衡和一个简单的web服务客户端,让电影消费者调用用户服务。Ribbon:Ribbon是Netflix发布的开源云中间层服务项目。其主要功能是提供客户端软件负载均衡算法,将Netflix中间层服务连接在一起。Eureka是一个RESTful服务,用于定位运行在AWS域(Region)中的中间层服务。本文介绍了Eureka与Ribbon的集成,并以Ribbon的自定义负载均衡算法为例。Feign:在SpringCloudNetflix栈中,每个微服务都以HTTP接口的形式暴露自己的服务,所以调用远程服务时必须使用HTTP客户端。我们可以使用JDK原生的URLConnection,Apache的HttpClient,Netty的异步HTTPClient,Spring的RestTemplate。Feign是一个声明式、模板化的HTTP客户端。在SpringCloud中使用Feign,我们可以实现与使用HTTP请求远程服务时调用本地方法一样的编码体验,非常快捷。这是电影服务的目录结构。点这里新建一个java文件pom并添加一个新的依赖org.springframework.cloudspring-cloud-starter-feignRibbon的加载平衡算法可以通过注解调用,也可以自定义配置负载平衡算法,但是不能和Application在同一个目录/***我们的IPing是一个PingUrl,它会ping一个URL以检查每个服务器的状态*server.provider有一个映射到/路径的方法;*这意味着当Ribbonping一个正在运行的提供者服务器时,它会得到一个HTTP200响应。**application.yml中定义的服务器列表:listOfServers:localhost:8000,*localhost:8002,localhost:8003**/@BeanpublicIPingribbonPing(IClientConfigconfig){//pingurl将尝试访问http://microservice-provider/provider/to//查看是否回购nse代码是200。检查PingUrl.isAlive()//参数/provider/是提供者服务的上下文路径returnnewPingUrl(false,"/provider/");/***我们设置的IRule,即AvailabilityFilteringRule,将使用Ribbon的*内置断路器功能来过滤掉处于*“开路”状态的任何服务器:如果ping无法连接到给定服务器,或者如果*它获取服务器读取失败,Ribbon将认为该服务器*“死”,直到它开始正常响应。**可用性过滤规则|过滤掉那些因为持续连接失败而被标记为电路跳闸的后端服务器,并过滤掉那些高并发(活跃连接数超过配置的阈值)的后端服务器|使用一个AvailabilityPredicate来包含过滤服务器的逻辑,其实就是查看status*RandomRule|中记录的每台服务器的运行状态随机选择一个服务器*BestAvailableRule|选择并发请求最小的服务器|一个一个的检查服务器,如果服务器跳闸了,忽略它,在其中选择*RoundRobinRule|roundRobin模式轮询选择|轮询索引,选择索引对应的服务器*WeighttedResponseTimeRule|根据响应时间分配权重,响应时间越长,权重越小,被选中的可能性越低|后台线程定期从状态中读取评估响应时间,并计算每个服务器的权重。Weight的计算也比较简单。响应时间减去每个服务器的平均响应时间就是服务器的权重。刚刚运行,没有形成statas时,使用roubine策略选择服务器。*重试规则|所选负载均衡策略的机上重试机制。|在配置时间段内选择服务器不成功时,尝试使用subRule选择一个可用的服务器*ZoneAvoidanceRule|综合判断服务器所在区域的性能和服务器的可用性来选择服务器|使用ZoneAvoidancePredicate和AvailabilityPredicate判断是否选择某台服务器,前面的判断判断一个zone的运行性能是否可用,去除不可用的zone(所有服务器),AvailabilityPredicate用于过滤掉连接过多的服务器。*@paramconfig*@return*/@BeanpublicIRuleribbonRule(IClientConfigconfig){//返回新的AvailabilityFilteringRule();returnnewRandomRule();////returnnewBestAvailableRule();//returnnewRoundRobinRule();//轮询//returnnewWeightedResponseTimeRule();//返回新的RetryRule();//返回新的ZoneAvoidanceRule();您可以检查色带的负载是否在控制器输出中实现。接下来配置feign,了解feignconfig@ConfigurationpublicclassFeignConfig{@BeanpublicContractfeignContract(){returnnewfeign.Contract.Default();}}定义feign的客户端接口,这里调用用户微服务的接口,feign支持springMvc注解,但是需要明确定义Request方法和参数@FeignClient(name="userprovider",configuration=FeignClient.class)publicinterfaceUserFeignClient{@RequestMapping(value="/user/{id}",method=RequestMethod.GET)publicUserfind(@PathVariable("id")intid);}然后在应用中添加feign注解@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublicclassMicroserviceSimpleConsumerMovieApplication{publicstaticvoidmain(String[]args){//@Bean//publicRestTemplaterestTemplate(){//returnnewRestTemplate();//}SpringApplication.run(MicroserviceSimpleConsumerMovieApplication.class,args);}}最后controller测试feign的接口@RestControllerpublicclassNewsController{@AutowiredRestTemplaterestTemplate;@AutowiredLoadBalancerClientloadBalancerClient;@AutowiredUserFeignClientuserFeignClient;@RequestMapping("/newsUser/{id}")publicUserfind(@PathVariableintid){returnrestTemplate.getForObject("http://localhost:8080/user/"+id,User.class);}@GetMapping("/test")publicStringtest(){ServiceInstanceserviceInstance=loadBalancerClient.choose("userprovider");Strings=serviceInstance.getHost()+serviceInstance.getPort()+serviceInstance.getServiceId();返回s;}@GetMapping("/movie/{id}")publicUserfindmovie(@PathVariableintid){returnuserFeignClient.find(id);}}分别启动eureka、user和movie微服务访问movie的测试接口,成功返回数据