最近接触微服务这块的东西,对这方面有了一些了解,拿出来和你们分享一下。html
Spring Cloud是基于Spring Boot的一整套实现微服务的框架,能够说,Spring Boot做为框架,Spring Cloud做为微服务,一块儿构成了一种不可忽视的、新生的框架体系。它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件,方便易用。Spring Cloud包含了很是多的子框架,其中,Spring Cloud Netflix是其中一套框架,它主要提供的模块包括:服务发现、断路器和监控、智能路由、客户端负载均衡等。java
2. Spring Cloud Netflix组件以及部署web
(1)Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看全部注册的服务的界面。 全部的服务使用Eureka的服务发现客户端来将本身注册到Eureka的服务器上。spring
(2)Zuul,网关,全部的客户端请求经过这个网关访问后台的服务。他可使用必定的路由配置来判断某一个URL由哪一个服务来处理。并从Eureka获取注册的服务来转发请求。json
(3)Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,若是一个服务启动了多个实例,就会经过Ribbon来经过必定的负载均衡策略来发送给某一个服务实例。tomcat
(4)Feign,服务客户端,服务之间若是须要相互访问,可使用RestTemplate,也可使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。服务器
(5)Hystrix,监控和断路器。咱们只须要在服务接口上添加Hystrix标签,就能够实现对这个接口的监控和断路器功能。app
(6)Hystrix Dashboard,监控面板,他提供了一个界面,能够监控各个服务上的服务调用所消耗的时间等。负载均衡
(7)Turbine,监控聚合,使用Hystrix监控,咱们须要打开每个服务实例的监控信息来查看。而Turbine能够帮助咱们把全部的服务实例的监控信息聚合到一个地方统一查看。框架
3. Spring Cloud Netflix组件开发
能够参考其中文文档:https://springcloud.cc/spring-cloud-netflix.html
(1)服务注册与监控中心:
@SpringBootApplication @EnableEurekaServer @EnableHystrixDashboard public class ApplicationRegistry { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
这里使用spring boot标签的 @SpringBootApplication
说明当前的应用是一个spring boot应用。这样我就能够直接用main函数在IDE里面启动这个应用,也能够打包后用命令行启动。固然也能够把打包的war包用tomcat之类的服务器启动。 使用标签 @EnableEurekaServer
,就能在启动过程当中启动Eureka服务注册中心的组件。它会监听一个端口,默认是8761,来接收服务注册。并提供一个web页面,打开之后,能够看到注册的服务。 添加 @EnableHystrixDashboard
就会提供一个监控的页面,咱们能够在上面输入要监控的服务的地址,就能够查看启用了Hystrix监控的接口的调用状况。 固然,为了使用上面的组件,咱们须要在maven的POM文件里添加相应的依赖,好比使用 spring-boot-starter-parent
,依赖 spring-cloud-starter-eureka-server
和 spring-cloud-starter-hystrix-dashboard
等。
(2)服务间调用:
两种方式能够进行服务调用,RestTemplate和FeignClient。无论是什么方式,他都是经过REST接口调用服务的http接口,参数和结果默认都是经过jackson序列化和反序列化。由于Spring MVC的RestController定义的接口,返回的数据都是经过jackson序列化成json数据。
第一种:RestTemplate,只须要定义一个RestTemplate的Bean,设置成 LoadBalanced
便可:
@Configuration public class SomeCloudConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } }
这样咱们就能够在须要用的地方注入这个bean使用:
public class SomeServiceClass { @Autowired private RestTemplate restTemplate; public String getUserById(Long userId) { UserDTO results = restTemplate.getForObject("http://users/getUserDetail/" + userId, UserDTO.class); return results; } }
其中, users
是服务ID,Ribbon会从服务实例列表得到这个服务的一个实例,发送请求,并得到结果。对象 UserDTO
须要序列号,它的反序列号会自动完成。
第二种:FeignClient
@FeignClient(value = "users", path = "/users") public interface UserCompositeService { @RequestMapping(value = "/getUserDetail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) UserDTO getUserById(@PathVariable Long id); }
咱们只须要使用 @FeignClient
定义一个借口,Spring Cloud Feign会帮咱们生成一个它的实现,从相应的users服务获取数据。 其中, @FeignClient(value = "users", path = "/users/getUserDetail")
里面的value是服务ID,path是这一组接口的path前缀。 在下面的方法定义里,就好像设置Spring MVC的接口同样,对于这个方法,它对应的URL是 /users/getUserDetail/{id}
。 而后,在使用它的时候,就像注入一个通常的服务同样注入后使用便可:
public class SomeOtherServiceClass { @Autowired private UserCompositeService userService; public void doSomething() { // ..... UserDTO results = userService.getUserById(userId); // other operation... } }
(3)断路器:
//断路器:为了解决当某个方法调用失败的时候,调用后备方法来替代失败的方法,已达到容错/阻止级联错误的功能 //fallbackMethod指定后备方法 @HystrixCommand(fallbackMethod = "doStudentFallback") @RequestMapping(value = "dostudent",method = RequestMethod.GET) public String doStudent(){ return "your name:secret,your age:secret!"; } public String doStudentFallback(){ return "your name:FEIFEI,your age:26!"; }
其中,使用@EnableCircuitBreaker来启用断路器支持,Spring Cloud提供了一个控制台来监控断路器的运行状况,经过@EnableHystrixDashboard注解开启。
以上是简单的一些对Spring Cloud Netflix组件的介绍。