- 微服务概述
- Spring Cloud微服务介绍
- Eureka
- Eureka应用
1.1.认识微服务架构
1.1.1.单体架构
一个典型的单体应用就是将所有业务场景的表示层、业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包,部署在一台服务器上。
以一个进存销系统的单体应用为例,架构如下图所示。
1.1.2.集群架构
随着用户量的增加,此时单一的服务器已经无法支撑起用户的访问,动不动就挂掉的网站肯定是没有人愿意使用的。
为了解决这个问题,人们就开始想办法,将服务器进行横向扩展,也就是把同一个war包,同时部署到多个服务器上,然后使用负载均衡技术,根据集群中每个节点的负载情况,将用户请求转发到合适的节点上。
1.1.3.分布式SOA架构
分布式SOA架构将原来的单体架构按照功能细分为不同的子系统, SOA架构的进存销系统如下图所示。
一个完整的项目会分为多个模块,数据库也会有主库与从库两种,并且主库与从库是数据同步的。
1.1.4.微服务架构
微服务架构可以将服务进行更细粒度的划分,并使用轻量级机制(通常是HTTP资源的API)进行通信。这些服务是围绕业务功能构建的,可以使用不同的编程语言编写程序、使用不同的数据库存储数据。
微服务的主要特点:
每个服务按照业务划分;
服务之间通过轻量级机制(通常是 HTTP 资源的 API )进行通信;
可以使用不同语言开发;
可以使用不同的数据存储技术;
可独立部署,服务之间互相不影响;
可针对用户访问流量大的服务单独扩展,从而能够节约资源;
管理自动化。
1.2.初识Spring Cloud框架的特点以及常用组件
1.2.1.Spring Cloud概述
Spring Cloud是一个基于Spring Boot实现的微服务开发架构,它利用Spring Boot的开发便利性巧妙地简化了分布式系统的开发。例如配置管理、服务发现、断路器、智能路由、控制总线等操作,都可以使用Spring Boot开发风格做到一键启动和部署。可以说,Spring Cloud将Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.2.2.Spring Cloud微服务架构的特点
组件丰富,功能齐全
Spring Cloud 的组件非常多,涉及微服务的方方面面。SpringCloud是一系列组件的有机集合。
开箱即用,快速启动
Spring Cloud基于Spring Boot开发的,Spring Boot具有快速构建Spring应用、直接嵌入服务器、自动化配置的优点,Spring Cloud继承了Spring Boot快速构建和自动化配置的优点,有开箱即用,快速启动的特点。
模块部署方便,项目维护难度降低
Spring Cloud采用模块化开发,按照项目功能,将项目拆分为不同的模块,每个模块独立开发运行,模块之间不会互相影响。维护时只需要维护具体的模块,不需要改动其他模块的代码,从而降低模块后期维护的成本。
项目扩展性和稳定性较好
基于Spring Cloud的微服务架构中,每个模块基本都是一个Spring Boot项目,它们都有独立的数据库,模块下的功能是横向开发的,如果需要扩展新的功能,可以新建该功能对应的独立数据库以及新的模块,不需要在之前的模块上修改,项目扩展更方便,项目稳定性更好,更容易实现敏捷开发,快速交付。
具有容错处理机制
实际开发中会因为网络连接失败、超时、服务器硬件故障等原因导致其中某个模块无法正常运行,导致整个项目发生异常,所以容错机制变得尤为重要。在Spring Cloud中提供了Hystrix组件,该组件专门用于处理容错,从而能保证某个模块出错后有其他备用模块或者善后处理。
1.2.3.Spring Cloud微服务架构的常用组件以及模块
Spring Cloud是一系列框架的有序集合,为开发人员构建微服务架构提供了完整的解决方案,但是Spring Cloud并不是一个拿来即可用的框架,Spring Cloud Netflix 和Spring Cloud Alibaba是为开发者提供了这套规范的实现方式。
常用的五大组件
Eureka : 服务注册中心 ,基于 HTTP 协议 的分布式中间件,主要 用于服务管理 。
Ribbon : 负载均衡 组件 ,支持多种负载均衡策略,可 以 配合服务发现和断路器使用, 在客户端实现负载均衡 。
Hystrix : 熔断器 ,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点 , 从而 对延迟和故障提供更强大的容错能力 。
Feign :一个 REST 客户端 ,基于 Ribbon 和 Hystrix 的 声明式服务调用组件 。
Zuul : 服务网关 ,为微服务集群提供 代理 , 过滤 , 路由 等功能。
通过一个图来表现。
1.2.4.Spring Cloud版本号
Spring Cloud版本号并不是熟悉的数字版本号,而是一个名称代号,这些代号据说是根据伦敦地铁命名的,分别是Angel、Brixton、Camden、Dalston、Edgware、Finchley 、 Greenwich、Hoxton,其中Angel版本是第一个Release版本。
Spring Cloud的版本名称,通常是由“版本号+小版本名称”组成的。这样设计的目的是为了更好地管理每个Spring Cloud子项目的清单,避免自己的版本号与子项目的版本号混淆。例如,Hoxton.SR9版本中, Hoxton代表的是版本号, SR9是小版本名称。
Spring Cloud官方:
https://spring.io/projects/spring-cloud https://spring.io/projects/spring-cloud
注意:Spring Cloud的版本取决于Spring Boot的版本
1.3.Eureka介绍
Eureka是Netflix开发的服务注册与发现框架, 是Spring Cloud 体系中最核心的注册中心组件。服务的注册发现对于微服务来说是一个非常重要的环节。在微服务架构中,每个服务(Service)是动态变化的,难以通过静态配置的方式维护服务,需要用到服务发现框架来完成服务(Service)的自动化管理。
1.4.Eureka工作原理
微服务架构中存在三种角色,分别是服务提供者、服务消费者和服务注册中心。
服务提供者需要在Eureka Server中完成注册,服务消费者会从Eureka Server中获取一份服务注册列表,该列表包含了所有注册的服务信息。服务消费者就会根据服务提供者的IP地址,通过HTTP远程调用服务提供者的服务。
1.5.搭建Eureka Server
基本流程:
创建项目,引入依赖
添加 Eureka 相关配置
添加 @EnableEurekaServer 注解
测试运行
1.5.1.开始搭建
1、创建项目,引入依赖
使用Spring Initializr方式创建一个名称为eureka-server的Spring Boot项目,这里将Group命名为com.cg,将Artifact命名为eureka-server,同时添加Web和Eureka Server依赖(spring-cloud-starter-netflix-eureka-server )。
2、添加Eureka的相关配置
在全局配置文件application.yml中添加Eureka的相关配置信息。
application.yml配置文件内容如下:
server:
port: 8761 # 服务器端口号7000
spring:
application: #实例名称配置
name: eureka-server
eureka:
client:
fetch-registry: false # 表示是否从Eureka Server获取注册信息
register-with-eureka: false # 表示是否向Eureka Server注册
service-url:
defaultZone:
http://localhost:8761/eureka/ #设置服务注册中心地址
2、在项目启动类添加@EnableEurekaServer注解
在项目启动类EurekaServerApplication上添加@EnableEurekaServer注解开启Eureka Server功能。启动eureka-server项目,在浏览器中访问http://localhost:8761/。效果如下图所示。
1.5.2.搭建服务提供者
基本流程:
创建项目,引入依赖
添加 Eureka 相关配置
添加 @EnableEurekaClient 注解
测试运行
1、创建项目,引入依赖
使用Spring Initializr方式创建一个名称为eureka-provider的Spring Boot项目,这里将Group命名为com.cg,将Artifact命名为eureka-provider,同时添加Web、Eureka Client依赖(spring-cloud-starter-netflix-eureka-client)。
2、添加Eureka的相关配置
在全局配置文件application.yml中添加Eureka的相关配置信息。application.yml配置文件内容如下:
server:
port: 7006
spring:
application:
name: eureka-provider
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #设置服务注册中心地址
3、在项目启动类添加@EnableEurekaClient注解
在项目启动类EurekaProviderApplication上添加@EnableEurekaClient注解开启Eureka Client功能。
4、在项目中添加一个控制器提供获取商品列表服务
@RestController
public class ProductController{
@RequestMapping("/product/list")
public List<Product> getList(){
Product product1 = new Product("苹果1", 20, 100,);
Product product2 = new Product("香蕉1", 30, 200,);
Product product3 = new Product("橘子1", 40, 300,);
return Arrays.asList(product1 ,product2 ,product3 );
}
}
保证Eureka Server启动的状态下,启动eureka-provider,在浏览器中访问Eureka Server的主界面http://localhost:8761/,效果如下图所示。
1.5.2.搭建服务消费者
基本流程:
创建项目,引入依赖
添加 Eureka 相关配置
添加 @EnableEurekaClient 注解
测试运行
1、创建项目,引入依赖
使用Spring Initializr方式创建一个名称为eureka-consumer的Spring Boot项目,这里将Group命名为com.cg,将Artifact命名为eureka-consumer,添加Web、Eureka Client依赖。
2、添加Eureka的相关配置
在全局配置文件application.yml中添加Eureka的相关配置信息。application.yml配置文件内容如下:
server:
port: 7002
spring:
application:
name: eureka-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3、在项目启动类添加@EnableEurekaClient注解
在项目启动类EurekaConsumerApplication上添加@EnableEurekaClient注解开启Eureka Client功能。
4、通过RestTemplate模板类调用生产者实例中的服务
然后就可以通过RestTemplate对象调用生产者实例中的HTTP服务
1.6.测试实行
保证Eureka Server启动的状态下,启动eureka-consumer。在浏览器访问http://localhost:7002/order获取订单信息,可以看到成功调用了eureka-provider中提供的获取商品列表的服务。效果如下图所示。