Spring Cloud netflix

微服务简介

1 什么是微服务

2014年,Martin Fowler(马丁·福勒 ) 提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通信。同时服务会使用最小的规模的集中管理能力,服务可以用不同的编程语言与数据库等组件实现。

马丁·福勒是敏捷联盟的成员,于2001年,同其他16名合著者一起协助创作了“敏捷软件开发宣言”。他负责维护一个bliki网站—一种blog和wiki的混合衍生物,他还使控制反转(Inversion of Control)“依赖注入模式(Dependency Injection)”一词得到普及。

架构的演变

随着互联网的发展,网站应用的规模也不断的扩大,进而导致系统架构也在不断的进行变化,从互联网早起到现在,系统架构大体经历了下面几个过程:

单体应用架构:

把所有功能都集中在一个应用中,统一部署,开发成本、部署成本和维护成本低

  • 优点:项目架构简单,适合用户量少的项目,开发成本低,项目部署在一个节点上,维护方便。
  • 缺点:功能集中在一个工程中,对于大型项目比一开发和维护,项目模块紧耦合,单点容错率低,无法对不同的模块功能进行针对性的优化和水平拓展

垂直应用架构:

所谓垂直应用架构,其实就是把之前的单体应用拆分成多个应用,以提升效率,比如电商系统可以拆分成:电商系统、后台系统、CMS系统

  • 优点:项目拆分实现了流量分担,解决了并发问题,而且可以针对不同模块进行优化和水平拓展,同时不同的系统之间不会互相影响,提高容错率
  • 缺点:系统之间互相存在,无法进行相互调用,系统之间互相独立,会造成一部分功能的冗余

分布式架构:

随着业务的增加,在垂直应用架构中冗余的业务代码越来越多,就需要将冗余的部分抽取出来,统一做成业务层单独处理,变成一个单独的服务,控制层调用不同的业务层服务就能完成不同的业务功能,具体表现就是一个项目拆分成表现层和服务层两个部分,服务层中包含业务逻辑,表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,这就是分布式架构。

  • 优点:抽取公共的功能作为服务层,提高代码复用行。
  • 缺点:系统间耦合度变高,调用关系错综复杂,难以维护。

SOA架构:

分布式架构中的缺点就是调用复杂,而且当服务越来越多,或者当某一个服务压力过大需要水平拓展和负载均衡,对于资源调度和治理就需要用到治理中心SOA(Service Oriented Architecture)为核心来解决,同时治理中心还可以帮助我们解决服务之间协议不同的问题。

  • 优点:使用治理中心(ESB\dubbo)解决了服务见调用关系的自动调节
  • 缺点:服务间会有依赖关系,一旦某个环节出错会影响较大(服务雪崩),服务关系复杂,运维、测试部署困难。

微服务架构:

微服务架构在某种程度上面架构SOA继续发展的下一步,它更加强调服务的“彻底拆分”,目的就是提高效率,微服务架构中,每个服务必须独立部署同时互不影响,微服务架构更加轻巧,轻量级。

微服务架构与SOA架构的不同

  1. 微服务架构比SOA架构会更加的精细,让专业的人去做专业的。
  2. 目的是提高效率每个服务之间互不影响,微服务架构中,每个服务需要独立部署
  3. SOA架构中可能数据库存储会发生共享,微服务强调每个服务都是单独数据库,保证每个服务之间互不影响。
  4. 微服务项目架构比SOA架构更加适合与互联网公司迅捷开发、快速迭代版本,因为粒度非常精细。

微服务架构:

  • 优点:服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展
  • 缺点:分布式系统开发的技术成本高(容错、分布式事务等),复杂性更高,每个微服务进行分布式独立部署,当进行模块调用的时候,分布式将会变得更加麻烦。

Spring Cloud 发展历史

Spring Cloud netflix -> Spring Cloud Alibaba

  1. 2020-12-22日Spring 官方博客宣布,Spring Cloud 2020.0.0正式发布。2020.0.0是第一个使用新的版本号命名方案的Spring Cloud 发行版本。在此之前Spring Cloud 使用英国伦敦地铁站的命名方式来命名一个大版本(train version),如果不按照新的版本号命名的话,本次的版本号应该是Ilford。
  2. 更新版本没有什么大惊小怪的,但是本次更新却正式开启了Spring Cloud Netflix 体系的终结进程。Netflix 公司是目前微服务落地中最成功的公司。它开源了诸如EurekaHystrixZuulFeignRibbon 等等广大开发者所知微服务套件,统称为Netflix OSS 。在当时Netflix OSS 成为微服务组件上事实的标准。但是在2018年Netflix 公司宣布其核心组件HystrixRibbonZuulEureka 等进入维护状态 ,不再进行新特性开发,只修BUG。这直接影响了Spring Cloud 项目的发展路线,Spring 官方不得不采取了应对措施,在2019年的在 SpringOne 2019 大会中,Spring Cloud 宣布 Spring Cloud Netflix项目进入维护模式 ,并在2020年移除相关的Netflix OSS 组件。
  3. Spring Cloud Aalibaba 成为了主流

2.SpringCloud Netflix

版本兼容对照图:

组件介绍:

1. Eureka

Eureka是基于RESTRepresentational State Transfer)服务,提供服务发现并实现负载均衡和

故障转移。我们称此服务为Eureka服务。Eureka提供了Java客户端组件,Eureka Client,方便与

服务端的交互。客户端内置了基于round-robin实现的简单负载均衡。在Netflix,为Eureka提供

更为复杂的负载均衡方案进行封装,以实现高可用,它包括基于流量、资源利用率以及请求返回

状态的加权负载均衡。

服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。所有的服务使用Euraka的服务发现客户端将自己注册到Euraka的服务器上。

1: 概念

Eureka是基于REST(Representational State Transfer)服务,提供服务发现并实现负载均衡和

故障转移。我们称此服务为Eureka服务。Eureka提供了Java客户端组件,Eureka Client,方便与

服务端的交互。客户端内置了基于round-robin实现的简单负载均衡。在Netflix,为Eureka提供

更为复杂的负载均衡方案进行封装,以实现高可用,它包括基于流量、资源利用率以及请求返回

状态的加权负载均衡。

2: 架构图

3: Eureka单机搭建

基于Http来调用的

4: Eureka客户端配置

2. Ribbon

负债均衡,一个请求发送给某一个服务器应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过负载均衡策略来发送某一个服务实例

3. Fiegn

服务客户端,服务之间如果需要互相访问,可以使用RestTemplate,也可以使用Feing客户端访问。默认会使用Ribbon实现负载均衡

FeignNetflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用

HTTP API

集成了Robbin Hystrix;我们不需要单独的;

2: 使用步骤

2.1 导入jar包

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

2.2 需要将我们的启动类

@SpringBootApplication

//@EnableDiscoveryClient //代表我当前这个微服务是一个服务的消费者 调用别的服务

@EnableFeignClients //使用我们的Feign的方式去调用

public class OrderApiApplication {

public static void main(String[] args) {

SpringApplication.run(OrderApiApplication.class, args);

}

}

2.3 编写远程调用的接口

@FeignClient(name = “ldx-order”) //代表我们调用的服务的远程的app的名称

public interface OrderFeignClient {

@PostMapping(“/order/add”) //调用的远程的地址

public String add(OrderInfo orderInfo);

}

2.4 通过接口直接调用我们的其他微服务;

通过Http的方式直接调用的;

2.5 参数传递

我们需要在服务的提供者 加上 @RequestBody

4. Hystrix

监控和服务熔断器。服务接口上添加Hystrix标签后,就可以实现对这个接口的监控和断路器功能。

Hystrix Dashboard,监控面板,提供了一个界面,可以监控各个服务器上的服务调用所消耗的时间等

Trubine,监控聚合,使用Hystrix监控,需要打开每一个服务实例的监控信息来查看

5. Zuul

网关,所有的客户端请求听过这个网关访问后台的服务,他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Euraka获取注册的服务来转发请求

2: 使用

2.1 导入jar包 
2.2 启用zuul网关 
2.3 配置路由转发规则 
<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
</dependency> 
<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-netflix-zuul</artifactId> 
</dependency> 
package com.ldx.ldxzuul; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; 
@SpringBootApplication 
@EnableZuulProxy 
@EnableEurekaClient 
public class LdxZuulApplication { 
public static void main(String[] args) { 
SpringApplication.run(LdxZuulApplication.class, args); 
} 
} 
spring: 
application: 
name: ldx-zuul 
server: 
port: 8080 
#配置一个路由器 
zuul: 
routes: 
order-api:path: /oapi/** 
serviceId: ldx-order-api 
#从eureka获取我们的服务器的真实ip地址 
eureka: 
client: 
service-url: 
defaultZone: http://127.0.0.1:7000/eureka 
instance: 
prefer-ip-address: true 
instance-id: ${spring.cloud.client.ip-address}:${server.port}

<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
</properties>
5.2 项目架构
项目名称 : ldx-demo
项目模块 :
ldx-dependency
pom方式;项目总依赖包;通用的依赖版本;总体父项目
ldx-commons
jar包方式;项目公共包;包含通用实体类,工具类,结果码等.
ldx-eureka
项目注册中心;可做集群 ; 默认端口 8761;
应用名称(spring.application.name) : ldx-eureka
端口规划 : 7000 ; 集群规划 7000,7001,7002;
ldx-order
订单服务接口 ; 可做集群 ; 默认端口 8000
应用名称(spring.application.name) : ldx-order
端口规划 : 8000 - 8199
ldx-order-api
订单服务 ; 实际调用ldx-order ; 可做集群 ; 默认端口 8200
应用名称(spring.application.name) : ldx-order-api
端口规划 : 8200 - 8399
ldx-goods
商品服务接口 ; 可做集群 ; 默认端口 8400
应用名称(spring.application.name) : ldx-goods
端口规划 : 8400 - 8599
ldx-goods-api
商品服务 ; 实际调用ldx-goods; 可做集群 ; 默认端口 8600
应用名称(spring.application.name) : ldx-goods-api
端口规划 : 8600 - 8799

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部