本文最后更新于 2024-11-02,文章内容可能已经过时。

微服务概念 

什么是微服务

微服务架构起源于Martin Fowler 由马丁·福勒(Martin Fowler) 与 詹姆斯·刘易斯(James Lewis)在2014年提出的一种思想。
https://martinfowler.com/microservices/

这种架构风格将大型应用程序拆分为一系列小型服务,每个服务都在自己的进程中运行,并通过轻量级通信机制(如基于HTTP协议的RESTful API)进行交互。这些服务围绕特定的业务能力构建,具有独立的部署和扩展能力,并且可以通过自动化部署机制进行快速迭代和更新。这些服务使用集中式的最小化管理,同时允许使用不同的开发语言、数据存储技术和基础设施。微服务架构旨在提高系统的可扩展性、灵活性和可靠性。通过将其拆分为多个小型服务,每个服务都可以独立地开发和部署,从而提高了系统的整体可维护性和开发效率。

image.png

微服务的特征        
  • 服务按业务类型细分,实现业务间的清晰划分。

    • 按照业务切分

      • 用户项目、订单项目、 商品项目…

    • 谁创建,谁负责

      • 谁开发,谁维护,谁部署

    • 项目单一职责      

      • 用户项目不能包含订单业务,订单项目不能包含用户项目      

  • 服务间通过轻量级API进行通信,确保高效的数据交换和协同工作。      

  • 支持多种编程语言开发,满足不同开发团队的技术需求。      

  • 可灵活选择数据存储技术,满足数据存储的多样性和灵活性需求。      

  • 各服务可独立部署,互不干扰,增强系统的可维护性和可扩展性。      

  • 针对高流量服务可单独扩展,实现资源优化,提高系统整体性能。      

  • 自动化管理,简化运维流程,提高工作效率。      

image.png

⬆️左单体式架构 右微服架构        

远程过程调用    

提供者(Provider):负责提供一套接口或功能,以供其他项目使用或集成。它是服务或资源的提供者,确保其他项目可以通过特定的方式访问和使用这些服务或资源。

消费者(Consumer):是调用提供者所提供的接口或服务的项目。它通过调用这些接口来获取所需的数据或服务,从而实现自身的功能或业务逻辑。

image.png

RPC与Restful

RPC(Remote Procedure Call)是远程过程调用的缩写形式,主要基于TCP/IP协议进行通信。它允许一台计算机(客户端)通过网络调用另一台计算机(服务器)上的程序或函数,就像调用本地程序一样。

Restful则是一种网络应用程序的设计风格和开发方式。它基于HTTP协议,并使用标准的客户端-服务器模型。Restful API可以使用XMLJSON等格式定义数据,通过不同的HTTP方法(如GET、POST、PUT等)来实现对资源的操作。

集群

集群是指在一组服务器上部署多个服务实例,每个服务实例可以看作是一个节点。通过部署N个节点,处理业务的能力可以大致提升N倍。这些相互协作的节点的集合就构成了集群。

分布式

分布式结构是将一个完整的系统按照业务功能拆分成多个独立的子系统或服务。在分布式系统中,每个子系统或服务都可以独立运行在各自的Web容器中,并通过RPCRestful等通信方式相互协作。这种拆分有助于实现系统的可扩展性、可靠性和性能优化。

http://dubbo.io/ Dubbo是一个高性能、轻量级的开源Java RPC框架,用于构建高性能、透明化的远程服务调用和服务治理的解决方案。

Spring Cloud简介

http://projects.spring.io/spring-cloud/ Spring Cloud是基于Spring Boot构建的微服务框架,它提供了一系列组件,涵盖了微服务开发的各个方面,包括配置管理、服务注册与发现、断路器、智能路由、微代理、控制总线等。此外,Spring Cloud还提供了全局锁、决策竞选、分布式会话和集群状态管理等高级功能。与Spring Boot框架结合使用,可以极大地简化微服务架构的开发过程。

Spring Cloud特征
  • 分布式配置管理/版本控制

  • 服务注册与发现机制

  • 路由设计与实现

  • 服务间请求调用机制

  • 负载均衡策略与优化

  • 断路器模式及其实践

  • 全局锁同步技术

  • 领导选举算法及集群状态管理

  • 分布式消息传递系统

体系组件名称

 作用定位 

Eureka   

作为服务注册与发现中心,提供高效的服务注册与发现功能。   

Open Feign   

请求客户端,简化微服务之间请求调用   

Hystrix   

容错处理   

Ribbon   

为微服务提供负载均衡   

Gateway(Zuul)   

网关,提供服务转发与校验服务   

Config   

分布式配置,提供统一配置服务   

Sleuth   

服务追踪,提供微服链路追踪服务   

Spring Cloud的版本说明 

Spring Cloud早期的版本以伦敦地铁站命名,如Angel(安吉尔)、Brixton(布里克斯顿)等,富有浓厚的英伦气息。而现在的新版本则采用开发日期作为版本号,如2020.0.x,更加直观且易于理解。从Angel到如今的2020.0.x,Spring Cloud在不断成长与进化,见证了云计算领域的飞速发展。

Eureka简介:

Eureka是Spring Cloud框架中一个重要的组件,主要负责服务注册与发现功能。它遵循CAP理论中的A(可用性)和P(分区容错性)。同时,Eureka也是Netflix公司开源的一个服务注册管理框架。与Zookeeper和Consul类似,Eureka用于管理服务的注册与发现,Spring Cloud也集成了Zookeeper和Consul。

在Eureka系统中,主要分为Eureka Server和Eureka Client两个部分。

Eureka Server:
  • 作为服务的注册中心,提供服务的注册与发现功能。

Eureka Client:
  • 对于服务提供方(Service Provider),它负责将自身服务注册到Eureka Server,以便服务消费方能够发现并调用这些服务。

  • 对于服务消费方(Service Consumer),它可以从Eureka Server获取已注册的服务列表,从而能够消费这些服务。

image.png

小故事     

Netflix简介及其与Spring Cloud的紧密合作 

Netflix是全球知名的在线视频流媒体服务平台,以其丰富多样的剧集、电影及原创内容吸引了全球观众的目光,特别是在美剧领域备受瞩目。随着业务的迅速扩展和用户访问量的不断增长,Netflix的技术架构也在持续演进。为了应对大规模的用户访问和数据处理需求,Netflix引领了微服务架构的浪潮。微服务架构使得Netflix能够更灵活地扩展、更新和运维服务,从而提高系统的稳定性和响应速度。虽然Netflix并不是最早尝试微服务架构的公司,但其在生产级别的实践却是大规模且具有深远影响的。
为了支撑这种大规模的业务运行,Netflix充分利用AWS云进行服务器运维。AWS云的弹性扩展、高可用性等特点为Netflix的业务提供了强大的支持,而Netflix的业务规模也促进了AWS云的持续发展和壮大。
在开源方面,Netflix将其微服务架构的核心技术栈开源,形成了Netflix OSS,为整个开源社区提供了宝贵的经验和资源。
Spring Cloud是构建微服务的重要框架之一,它提供了微服务架构的一站式解决方案。基于Spring Boot开发,Spring Cloud简化了微服务的开发、部署和运维。Pivotal公司在吸收和融合Netflix开源核心技术的基础上,进一步封装和整合,形成了Spring Cloud。Spring Cloud不仅集成了Netflix的许多成熟方案,还支持其他多种服务发现和配置管理方案,从而进一步推动了微服务架构的普及和发展。
可以说,Netflix与Spring Cloud在微服务领域有着紧密的合作关系。Netflix的实践为整个行业提供了宝贵的经验和启示,而Spring Cloud则为开发者提供了强大的支持和方便的工具,两者共同推动了微服务架构的繁荣和发展。

最佳实践

使用Eureka实现注册中心
  1. 创建一个名称为demo-eureka-server的Spring Boot项目 推荐使用阿里云镜像 https://start.aliyun.com image.png

  2. 添加项目依赖

    1. image.png

  3. 在启动类添加启动注解

    1. @EnableEurekaServerimage.png

    2. 添加配置信息

      eureka :
      instance:
      prefer-ip-address:false
      instance-id: S{spring.cloud.client.ip-address}:S{server.port}
      Lease-expiration-duration-in-seconds:30
      Lease-renewal-interval-in-seconds:5
      hostname:eureka1
      client:
      register-with-eureka:false
      #表示此实例是否注册到 Eureka Server 以供其他艾网发现
      fetch-registry:false
      #表不客户端是含从 Eureka server 获取实例让册信息
      service-url:
      defaultZone: http://eureka1:7776/eureka/
      server:
      enable-self-preservation:true
      #启用自我你扩
      eviction-interval-timer-in-ms:5000
      spring:
      application:
      name:register-center
      server:
      port:7776
Eureka的自我保护机制
  1. 在Eureka Server的默认配置中,如果在默认设置的90秒内没有收到客户端的心跳信号,该实例将被注销。

  2. 然而,在微服务跨进程通信的过程中,网络通信可能会出现各种问题。即使微服务状态正常,仅仅因为网络分区故障,Eureka Server注销服务实例也可能导致大部分微服务变得不可用。这种情况非常危险,因为服务实际上并没有问题。

  3. 为了应对这一问题,Eureka设计了一种自我保护机制。

  4. 这种机制的工作原理是:当Eureka Server在短时间内失去大量的客户端连接时(可能是由于网络故障),它会进入自我保护模式。在这种模式下,Eureka Server将不会注销任何微服务实例,从而确保服务的可用性。一旦网络故障恢复,服务器将自动退出自我保护模式。这一机制有助于确保在面临网络波动时,微服务仍然能够保持正常运行。

image.png

  1. us-east-1c区域,Application Service扮演着微服务的提供方角色,而Application Client则是服务的调用方。他们通过MakeRemoteCall进行通讯,这种行为可以理解为RESTful API的交互。

  2. 双方都与Eureka Server保持紧密联系。Eureka Client通过向Eureka Server发送心跳信号来续约自己在服务注册表中的位置。

  3. Eureka Server具备服务发现功能,能够存储各个微服务在启动阶段所发送的信息。

  4. 如果Eureka Server在一定时间内没有收到某个微服务实例的心跳,就会判断该实例出现问题,进而注销其注册信息。

  5. 在多节点环境中,Eureka Server也可以作为Eureka Client运行。如图1d、1e和1c所示,各节点间的Eureka Server通过相互复制来同步各自的服务注册表信息。

  6. Eureka Client会缓存服务注册表中的信息,以减少对Eureka Server的查询次数,降低服务器压力。即使在所有Eureka Server都出现故障的情况下,消费者仍可根据缓存的信息完成服务调用。

实现Eureka的集群配置
  1. 复制单机版的项目为cluster-eureka-server的Spring Boot项目

    1. image.png

  2. 添加配置信息

    eureka:
    instance:
    prefer-ip-address:false
    instance-id:S{spring.cloud.client.ip-address}:S{server.port
    Lease-expiration-duration-in-seconds:30
    lease-renewal-interval-in-seconds:
    server :
    enable-self-preservation:true #启用自我保护
    eviction-interval-timer-in-ms:5000
    spring:
    application:
    name:register-center
server
port:7776
eureka:
client:
register-with-eureka:true
fetch-registry: true
service-url:
defaultZone: http://eureka1:7776/eureka,http://eureka2:7777/eureka
instance:
hostname: eureka1
server
port:7777
eureka:
client:
register-with-eureka:true
fetch-registry: true
service-url:
defaultZone: http://eureka1:7776/eureka,http://eureka2:7777/eureka
instance:
hostname: eureka2
为Eureka Server添加用户认证

1.在POM文件中添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.在application中增加pwd和name

s
    

3.添加放行代码

public class DemoEurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoEurekaServerApplication.class, args);
    }
    @EnableWebSecurity
    static class WebSecurityConfig extends WebSecurityConfigurerAdapter{
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable();
            super.configure(http);
        }
    }
}

4.启动服务,出现登录页面

image.png

Feign简介

前言

  1. 一个成熟的微服务解决方案,其内部调用往往依赖于高效的RPC(远程过程调用)框架,如基于HTTP协议的Feign或基于TCP协议的Dubbo。这些框架简化了服务间的通信,提高了系统的可伸缩性和灵活性。

  2. 若不使用RPC框架,通过HTTP进行服务调用将涉及复杂的配置,如设置请求头(headers)和请求体(body)。获取响应后,还需要进行解析等操作,这无疑增加了开发的复杂性和出错的可能性。

关于Feign的介绍:

  1. Feign是一个轻量级的HTTP请求调用框架,它允许开发者通过Java接口注解的方式方便地发起Http请求。Feign通过解析注解,将请求模板化,使得在实际调用时只需传入参数,框架会根据参数自动生成对应的请求,从而简化了HTTP调用的流程。

    1. 作为声明式和模板化的HTTP客户端,Feign极大地简化了微服务间的调用。它提供了一种更简洁、更直观的方式来消费远程服务,提高了开发效率和系统稳定性。

    希望以上内容能够满足您的要求。

Spring Cloud Feign和OpenFeign组件

Spring Cloud Feign

  1. Spring Cloud Feign组件是一个轻量级RESTful的HTTP服务客户端。

  2. 可以与Eureka和Ribbon组合使用以支持负载均衡。

image.png

Spring Cloud OpenFeign

  1. Spring Clout OpenFeign是在Spring Cloud Feign组件的基础上进行了封装,使其支持了Spring MVC标准注解和HttpMessageConvertersimage.png

Feign-微服务接口调用
  1. 启动Eureka Server服务

  2. 创建两个项目,将其注册到Eureka Server

    1. 项目一: demo-user-consumer

    2. 项目二: demo-user-provider

  3. 创建服务方法

    1. 在demo-user-provider 中

    2. 添加UserService类,

    3. 提供checkuser()方法

image.png

4.创建接口

  1. 在demo-user-consumer中添加依赖

  2. 在demo-user-consumer中创建UserFeignClient 接口

  3. 为接口添加@FeignClient注解并指定name属性值

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

image.png

@FeignClient被调用服务在Eureka Server的名称

5.添加注解

demo-user-consumer的启动类添加注解@EnableFeignClients

6.接口调用

  1. 在demo-user-consumer中创建LocalUserService接口,定义login()方法,并创建实现类LocalUserServiceImpl。

  2. 在demo-user-consumer中创建UserController类。

Feign-接口调用传递参数

demo-user-provider的checkUser()方法,添加参数

image.png

demo-user-consumer的UserFeignClient 接口,和提供服务方法保持一致

image.png

demo-user-consumer的login()方法,调用服务时传入参数

image.png

总结

  1. Spring Boot是基于Spring的一套快速配置脚手架,旨在简化单个微服务的快速开发过程。

  2. Spring Cloud是一个基于Spring Boot的云应用开发工具集,专注于全局的服务治理。Spring Boot强调快速和方便的集成单个服务组件,而Spring Cloud则在此基础上进一步关注整个微服务架构的管理和协同。

  3. Spring Boot秉承了默认优于配置的理念,许多集成方案已经预先配置好,无需过多自定义配置。而Spring Cloud在很大程度上依赖于Spring Boot的这些默认配置来实现其全局服务治理的功能。

  4. 虽然Spring Boot可以独立用于开发项目,但Spring Cloud是建立在Spring Boot基础上的,二者之间存在依赖关系。Spring Boot提供了基础架构和工具支持,而Spring Cloud则进一步扩展了这些功能,为构建云原生应用提供了全面的解决方案。