|
|
|
|
移动端

1.11 通过示例来介绍Spring Cloud

《Spring微服务实战》第1章欢迎迈入云世界,Spring,本书主要介绍微服务架构,以及为什么应该考虑采用微服务架构来构建应用。本节为大家介绍通过示例来介绍Spring Cloud。

作者:陈文辉 译来源:人民邮电出版社|2018-05-23 14:18

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

1.11 通过示例来介绍Spring Cloud

在本章最后这一节中,我们概要回顾一下要使用的各种Spring Cloud技术。因为每一种技术都是独立的服务,要详细介绍这些服务,整整一章的内容都不够。在总结这一章时,我想留给读者一个小小的代码示例,它再次演示了将这些技术集成到微服务开发工作中是多么容易。

与代码清单1-1

中的第一个代码示例不同,这个代码示例不能运行,因为它需要设置和配置许多支持服务才能使用。不过,不要担心,在设置服务方面,这些Spring Cloud服务(配置服务,服务发现)的设置是一次性的。一旦设置完成,微服务就可以不断使用这些功能。在本书的开头,我们无法将所有的精华都融入一个代码示例中。

代码清单1-2中的代码快速演示了如何将远程服务的服务发现、断路器、舱壁以及客户端负载均衡集成到“Hello World”示例中。

代码清单1-2 Hello World Service使用Spring Cloud

  1. package com.thoughtmechanix.simpleservice;  
  2. // 为了简洁,省略了其他import语句  
  3. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;   
  4. import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;   
  5. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;  
  6. import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;  
  7. @SpringBootApplication  
  8. @RestController  
  9. @RequestMapping(value="hello")  
  10. @EnableCircuitBreaker⇽--- 使服务能够使用Hystrix和Ribbon库  
  11. @EnableEurekaClient  
  12. public class Application {⇽--- 告诉服务,它应该使用Eureka服务发现代理注册自身,并且服务调用是使用服务发现来“查找”远程服务的位置的  
  13.     public static void main(String[] args) {  
  14.         SpringApplication.run(Application.class, args);  
  15.     }  
  16.     @HystrixCommand(threadPoolKey = "helloThreadPool")⇽--- 包装器使用Hystrix断路器调用helloRemoteServiceCall方法  
  17.     public String helloRemoteServiceCall(String firstName, String lastName){  
  18.     ResponseEntity<String> restExchange =   
  19.     ➥  restTemplate.exchange(  
  20.         ➥  "http://logical-service-id/name/⇽--- 使用一个装饰好的RestTemplate类来获取一个“逻辑”服务ID,Eureka在幕后查找服务的物理位置  
  21.             ➥   [ca]{firstName}/{lastName}",  
  22.         ➥  HttpMethod.GET,  
  23.         ➥  null, String.class, firstName, lastName);  
  24.     return restExchange.getBody();  
  25.     }  
  26.     @RequestMapping(value="/{firstName}/{lastName}"method = RequestMethod.GET)  
  27.     public String hello(@PathVariable("firstName") String firstName,  
  28.     ➥  @PathVariable("lastName") String lastName) {  
  29.         return helloRemoteServiceCall(firstName, lastName);  
  30.     }  

这段代码包含了很多内容,让我们慢慢分析。记住,这个代码清单只是一个例子,在第1章的GitHub仓库源代码中是找不到的。把它放在这里,是为了让读者了解本书后面的内容。

开发人员首先应该要注意的是@EnableCircuitBreaker和@EnableEurekaClient注解。@EnableCircuitBreaker注解告诉Spring微服务,将要在应用程序使用Netflix Hystrix库。@EnableEurekaClient注解告诉微服务使用Eureka服务发现代理去注册它自己,并且将要在代码中使用服务发现去查询远程REST服务端点。注意,配置是在一个属性文件中的,该属性文件告诉服务要进行通信的Eureka服务器的地址和端口号。读者第一次看到使用Hystrix是在声明hello方法时:

  1. @HystrixCommand(threadPoolKey = "helloThreadPool")  
  2. public String helloRemoteServiceCall(String firstName,String lastName) 

@HystrixCommand注解做两件事。第一件事是,在任何时候调用helloRemoteService Call方法,该方法都不会被直接调用,这个调用会被委派给由Hystrix管理的线程池。如果调用时间太长(默认为1 s),Hystrix将介入并中断调用。这是断路器模式的实现。第二件事是创建一个由Hystrix管理的名为helloThreadPool的线程池。所有对helloRemoteServiceCall方法的调用只会发生在此线程池中,并且将与正在进行的任何其他远程服务调用隔离。

最后要注意的是helloRemoteServiceCall方法中发生的事情。@EnableEurekaClient的存在告诉Spring Boot,在使用REST服务调用时,使用修改过的RestTemplate类(这不是标准的Spring RestTemplate的工作方式)。这个RestTemplate类允许用户传入自己想要调用的服务的逻辑服务ID:

  1. ResponseEntity<String> restExchange = restTemplate.exchange  
  2. ➥  (http://logical-service-id/name/{firstName}/{lastName} 

在幕后,RestTemplate类将与Eureka服务进行通信,并查找一个或多个“name”服务实例的实际位置。作为服务的消费者,开发人员的代码永远不需要知道服务的位置。

另外,RestTemplate类使用Netflix的Ribbon库。Ribbon将会检索与服务有关的所有物理端点的列表。每当客户端调用该服务时,它不必经过集中式负载均衡器就可以对客户端上不同服务实例进行轮询(round-robin)。通过消除集中式负载平衡器并将其移动到客户端,可以消除应用程序基础设施中的其他故障点(故障的负载平衡器)。

我希望此刻读者会印象深刻,因为只需要几个注解就可以为微服务添加大量的功能。这就是Spring Cloud背后真正的美。作为开发人员,我们可以利用Netflix和Consul等知名的云计算公司的微服务功能,这些功能是久经考验的。如果在Spring Cloud之外使用这些功能,可能会很复杂并且难以设置。Spring Cloud简化了它们的使用,仅仅是使用一些简单的Spring Cloud注解和配置条目。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

标准C++开发入门与编程实践

本书着重介绍标准C++语言,即1998年由ISO正式推出的关于C++的国际性标准版本。 本书从最基础的编程语言概念讲起,共分6篇24章。前4篇完整...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊