微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
以往我们开发应用程序都是单体型,虽然开发和部署比较方便,但后期随着业务的不断增加,开发迭代和性能瓶颈等问题,将会困扰开发团队,微服务就是解决此问题的有效手段。
那么我们在具体实践落地微服务时,我们又需要做什么?一个微服务框架到底又有什么呢?特别是对于.NET生态圈的小伙伴们,一直都有很多困惑,不知该如何下手。
既然我们不知道,又要高清楚,那最好的办法是什么呢?我认为最有效的方式是 研究成熟的产品 。市面上成熟的微服务框架有一些, 而SpringCloud就是可供研究的对象,下面我们一起来看看SpringCloud是什么?
从上面的技术栈图中可以看出:
组件 | 选型 | 备注 |
---|---|---|
网关 | Zuul | |
服务注册与发现 | EurekaConsulzookeeper | |
服务调用 | Feign | 根据注解和选择机器,拼接Url地址,发起请求简化服务调用 |
负载均衡 | Ribbon | 服务调用负载均衡,配合Feign和Euraka使用 |
断路器 | Hystrix | 隔离、熔断以及降级的一个框架服务线程池隔离,实现不同服务的调度隔离,避免服务雪崩 |
Eureka:服务启动时,Eureka会将服务注册到EurekaService,并且EurakeClient还可以返回过来从EurekaService拉去注册表,从而知道服务在哪里
Ribbon:服务间发起请求的时候,基于Ribbon服务做到负载均衡,从一个服务的对台机器中选择一台
Feign:基于fegin的动态代理机制,根据注解和选择机器,拼接Url地址,发起请求
Hystrix:发起的请求是通过Hystrix的线程池来走,不同的服走不同的线程池,实现了不同的服务调度隔离,避免服务雪崩的问题
Zuul:如果前端后端移动端调用后台系统,统一走zull网关进入,有zull网关转发请求给对应的服务
说明:如果.Net Core平台下想要使用SpringCloud,可通过 steeltoe 来实现,具体可参考 https://steeltoe.io/
一个较完整的微服务架构包含的如下的组件
组件 | 选型 |
---|---|
网关 | ZuulOcelotKongTykOrangeSpring Cloud Gatewayapiaxleapi-umbrella |
服务注册与发现 | EurekaConsulzookeeper |
服务调用 | FeignrestTemplate |
负载均衡 | Ribbon |
断路器 | Hystrix |
配置管理 | Spring Cloud Config |
链路追踪 | Spring Cloud SleuthZipkinHTracekyWalking |
安全 | Spring Cloud SecurityAuth2IdentityServer4 |
监控 | spectatoratlas |
消息、事件总线 | Spring Cloud Bus (Redis、RabbitMQ、Kafaka) |
上面已经介绍了一个微服务框架所包含的架构组件,那么.NET下如何落地呢?接下来我们从网关开始来一步一步实践。 .NET下的网关,我们推荐使用Ocelot,来开始我们的Ocelot之旅.