您现在的位置是:首页 > 文章详情

基于Spring Cloud的微服务架构设计

日期:2018-11-29点击:823

本文介绍微服务及其微服务架构的概念并描述了Spring Cloud的功能,然后基于Spring Cloud的各个组件搭建微服务的整体架构,并对总体架构进行了设计和说明。


总体架构图

构件一套完整的微服务架构需要考虑许多问题,包括API Gateway、服务间调用、服务发现、服务容错、服务部署、数据调用等。基于SpringCloud构建微服务架构可以通过自动配置和绑定Spring环境和其他Spring编程模型来实现微服务。采用Spring Boot应用程序提供的集成功能,通过几个简单的注释,开发人员可以快速配置和启用应用程序中的常见功能模块,并使用久经考验的Netflix组件构建大型分布式系统。 提供的微服务功能模块包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载均衡(Ribbon)等。图2显示了采用Spring Cloud系列平台构建的微服务整体架构。

images/x647GJPWmMaNKGpYfZd7DK2eXFtYJcps.png


图2 基于Spring Cloud系统的微服务架构平台


服务发现是microservice基础架构的关键原则之一。服务注册中心采用Spring CloudNetflix的项目可以自动注册服务,也可以通过HTTP接口手动注册。默认情况下,Eureka使用客户端心跳来确定一个客户端是否活着。也可以另指定DiscoveryClient来传播当前SpringBoot Actuator的应用性能的健康检查状态。


统一的接入服务接口采用Spring Cloud的Zuul组件,实现内外有别的微服务调用。该组件也实现了服务路由功能。采用Spring Cloud Netflix来实现服务的限流和降级。


为实现服务的高可用,保证服务的容错和负载均衡,本平台可采用客户端负载均衡(Ribbon)来实现。


Spring Cloud Netflix的Hystrix熔断器组件,具有容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。为保证核心服务的稳定性,可采用Spring Cloud Netflix的Hystrix组件来实现服务的服务的容错、限流和降级等功能。


微服务的安全控制和权限验证可采用Spring CloudSecurity来实现。对于RESTful,可采用Spring Cloud的Feign 组件,这是一个声明Web服务客户端。这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器


微服务应用组件设计明细


下面描述如何通过Spring Cloud来实现一个微服务架构。


服务注册与发现,服务注册中心


本步骤主要是创建服务注册中心,采用Spring CloudNetflix。Spring CloudNetflix项目是SpringCloud的子项目之一,其主要内容是SpringCloud对Netflix公司一系列开源产品的封装。采用Spring Boot应用的自配置,通过一些简单的注解,就能快速地构建庞大的分布式系统。


采用Spring boot的应用,简单的注解和配置即可启动Spring Cloud的Eureka服务发现功能。


@EnableEurekaServer

@SpringBootApplication

public  class Application {

public static void main(String[] args)  {

new  SpringApplicationBuilder(Application.class).web(true).run(args);

}

}


然后修改配置文件application.properties,修改Eureka服务器位置和相关初始化属性即可。


服务的提供方和消费方


创建服务提供方,基于Spring Boot很容易就可以实现一个微服务。第一步要建立一个服务。


@RestController

public  class HelloController {

@Autowired

private DiscoveryClient client;

@RequestMapping(value = "/hello" ,method = RequestMethod.GET)

public Integer add(@RequestParam String  parm) {

ServiceInstance instance =  client.getLocalServiceInstance();

return "hello " + parm ;

}

}


第二步要把微服务注册到Eureka服务器上。在主类中通过加上@EnableDiscoveryClient注解,该注解能激活Eureka中的DiscoveryClient实现,才能实现Controller中对服务信息的输出。


@EnableDiscoveryClient

@SpringBootApplication

public  class HelloServiceApplication {

public static void main(String[] args)  {

new SpringApplicationBuilder(HelloServiceApplication.class).web(true).run(args);

}

}


然后修改配置文件application.properties,映射到对应的Eureka服务器位置。


客户端的均衡


在Spring Cloud Netflix提供的功能中,包含有客户端负载均衡(Ribbon)功能。Ribbon是一个基于HTTP和TCP客户端的负载均衡器,可以通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。当Ribbon与Eureka联合使用时,通过重写接口代码,可以扩展成从Eureka注册中心中获取服务端列表。


构建一个基本Spring Boot项目,:在应用主类中,通过@EnableDiscoveryClient注解来添加发现服务能力。创建RestTemplate实例,并通过@LoadBalanced注解开启均衡负载能力。


@SpringBootApplication

@EnableDiscoveryClient

public  class RibbonApplication {

@Bean

@LoadBalanced

RestTemplate restTemplate() {

return new RestTemplate();

}

public static void main(String[] args)  {

SpringApplication.run(RibbonApplication.class, args);

}

}


在application.properties中配置eureka服务注册中心。


Feign客户端


Spring Cloud采用Feign客户端来实现其REST应用。Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单。我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。它具备可插拔的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插拔的编码器和解码器。Spring Cloud为Feign增加了对Spring MVC注解的支持,还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。


创建一个Spring Boot工程,配置pom.xml,将上述的配置中的ribbon依赖替换成feign的依赖即可。在应用主类中通过@EnableFeignClients注解开启Feign功能,具体如下:


@SpringBootApplication

@EnableDiscoveryClient

@EnableFeignClients

public  class FeignApplication {

public static void main(String[] args)  {

SpringApplication.run(FeignApplication.class, args);

}

}


定义compute-service服务的接口,使用@FeignClient("compute-service")注解来绑定该接口对应compute-service服务、通过Spring MVC的注解来配置compute-service服务下的具体实现。具体如下


@FeignClient("compute-service")

public  interface HelloClient {

@RequestMapping(method = RequestMethod.GET, value = "/hello")

String hello(@RequestParam(value = "name")String  a);

}


在Web层中调用上面定义的HelloClient,具体如下:


@RestController

public  class ConsumerController {

@Autowired

HelloClient helloClient;

@RequestMapping(value = "/hello", method = RequestMethod.GET)

public Integer hello() {

return computeClient.hello("name");

}

}


熔断器应用的开发


在微服务架构中,各单元间通过服务注册与订阅的方式互相依赖。但存在着对外服务的延迟和消失,造成连锁故障,最终导致整个系统的全面瘫痪。这需要有一个熔断器机制。所谓熔断器模式,在分布式架构中,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。


在Spring Cloud中使用了Hystrix 来实现熔断器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。Ribbon客户端是采用显示代码来引入Hystrix,实现断路器机制。


@SpringBootApplication

@EnableDiscoveryClient

@EnableCircuitBreaker

public  class RibbonApplication {

@Bean

@LoadBalanced

RestTemplate restTemplate() {

return new RestTemplate();

}

public static void main(String[] args)  {

SpringApplication.run(RibbonApplication.class, args);

}

}


SpringCloud构建微服务架构的服务网关


API-gateway服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供RESTAPI服务,同时具备服务路由、均衡负载、权限控制等功能。Spring Cloud Netflix中的Zuul就承担这样的职责,为微服务架构提供了接口保护功能,使得服务集群主体能够具备更高的可复用性和可测试性。


创建一个Spring Boot工程,应用主类使用@EnableZuulProxy注解开启Zuul。


@EnableZuulProxy

@SpringCloudApplication

public class  Application {

public static void main(String[] args)  {

new  SpringApplicationBuilder(Application.class).web(true).run(args);

}

}


修改application.properties中配置Zuul应用的基础信息,如:应用名、服务端口等。


SpringCloud构建微服务架构的分布式配置中心


Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持。Spring Cloud Config配置服务器默认采用Git软件,这有助于对环境配置进行程序代码的版本管理,并且可以通过Git客户端工具来方便地管理和访问配置信息。同时Spring Cloud Config也提供本地化文件系统的存储方式。


通过Spring Cloud构建一个Config Server,非常简单,只需要三步:创建Spring Boot的程序主类,并添加@EnableConfigServer注解,开启Config Server。


@EnableConfigServer

@SpringBootApplication

public  class Application {

public static void main(String[] args)  {

new  SpringApplicationBuilder(Application.class).web(true).run(args);

}

}


创建bootstrap.properties配置,来指定config server,


结束语


微服务架构及其应用现在有比较广泛的事情,微服务在等有一些优势。同时,SpringCloud作为微服务的一站式解决方案,能快速高效地搭建微服务架构,确实是实现微服务架构的一件利器。


文中阐述了微服务软件设计的原则和要求,列出了Spring Cloud的组成和实现微服务架构的优势,完成了公基于Spring Cloud的微服务架构设计。在实践中,采用Spring Cloud及其相关组件等软件,一步步实现一整套微服务架构,并且该应用程序的主体架构比较通用,对于学习和理解Spring Cloud和微服务有相当的参考意义。


文章转自:https://mp.weixin.qq.com/s/Otx88XJS7DcwhJ89gFLMEA

原文链接:https://blog.roncoo.com/article/127741
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章