微服务理论篇(整理)

微服务概念:

微服务不需要像普通服务那样成为一种独立的功能或者独立的资源。微服务是利用组织的服务投资组合,然后基于业务领域功能分解它们,在看到服务投资组合之前,它还是一个业务领域。

Spring Boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

理解:

Spring Boot就是一个快速开发的微框架,许多配置采用默认方式,来减少配置,内置容器,达到快速开发的目的。

Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

理解:

Spring Cloud框架比较大,因为涵盖了服务治理的方方面面,大致框架们分为两种,一种是直接封装现有的框架,另一种就是开发的一些东西的如Spring Cloud Stream。

第一种

Spring Cloud Netflix
  是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。
Spring Cloud Config
  将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件
Spring Cloud Bus
  分布式消息队列,是对Kafka, MQ的封装
Spring Cloud Security
  对Spring Security的封装,并能配合Netflix使用
Spring Cloud Zookeeper
  对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用
Spring Cloud Eureka

Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。

Spring Cloud Netflix

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

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

,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。
4、Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。
5、Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。
6、Hystrix Dashboard,监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。
7、Turbine,监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。而Turbine可以帮助我们把所有的服务实例的监控信息聚合到一个地方统一查看。这样就不需要挨个打开一个个的页面一个个查看。

微服务场景

1、我们把整个系统根据业务拆分成几个子系统。
2、每个子系统可以部署多个应用,多个应用之间使用负载均衡。
3、需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现。
4、所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个URL请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡。
5、服务之间有时候也需要相互访问。例如有一个用户模块,其他服务在处理一些业务的时候,要获取用户服务的用户数据。
6、需要一个断路器,及时处理服务调用时的超时和错误,防止由于其中一个服务的问题而导致整体系统的瘫痪。
7、还需要一个监控功能,监控每个服务调用花费的时间等。

下面就是使用上述的子框架实现的为服务架构的组架构图:
在上图中,有几个需要说明的地方:

1、ZUUL网关也在注册中心注册,把它也当成一个服务来统一查看。
2、负载均衡不是一个独立的组件,它运行在网关、服务调用等地方,每当需要访问一个服务的时候,就会通过Ribbon来获得一个该服务的实例去掉用。Ribbon从Eureka注册中心获得服务和实例的列表,而不是发送每个请求的时候从注册中心获得。
3、我们可以使用RestTemplate来进行服务间调用,也可以配置FeignClient来使用,不管什么方式,只要使用服务注册,就会默认使用Ribbon负载均衡。(RestTemplate需要添加@LoadBalanced)
4、每个服务都可以开启监控功能,开启监控的服务会提供一个servlet接口/hystrix.stream,如果你需要监控这个服务的某一个方法的运行统计,就在这个方法上加一个@HystrixCommand的标签。
5、查看监控信息,就是在Hystrix Dashboard上输入这个服务的监控url: http://serviceIp:port/hystrix.stream,就可以用图表的方式查看运行监控信息。
6、如果要把所有的服务的监控信息聚合在一起统一查看,就需要使用Turbine来聚合所需要的服务的监控信息。

我们也可以从上图中看出该架构的部署方式:

1、独立部署一个网关应用
2、服务注册中心和监控可以配置在一个应用里,也可以是2个应用。
3、服务注册中心也可以部署多个,通过区域zone来区分,来实现高可用。
4、每个服务,根据负载和高可用的需要,部署一个或多个实例。

史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)

一、spring cloud简介
鉴于《史上最简单的Spring Cloud教程》很受读者欢迎,再次我特意升级了一下版本,目前支持的版本为Spring Boot版本2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。

Finchley版本的官方文档如下:
http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的,所以需要开发中对springboot有一定的了解,如果不了解的话可以看这篇文章:2小时学会springboot。另外对于“微服务架构” 不了解的话,可以通过搜索引擎搜索“微服务架构”了解下。

二、创建服务注册中心
在这里,我还是采用Eureka作为服务注册与发现的组件,至于Consul 之后会出文章详细介绍。

2.1 首先创建一个maven主工程。

首先创建一个主Maven工程,在其pom文件引入依赖,spring Boot版本为2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom。这一系列文章全部采用这种模式,其他文章的pom跟这个pom一样。再次说明一下,以后不再重复引入。代码如下:


4.0.0

<groupId>com.forezp</groupId>
<artifactId>sc-f-chapter1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>sc-f-chapter1</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/>
</parent>

<modules>
    <module>eureka-server</module>
    <module>service-hi</module>
</modules>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

下面以创建server为例子,详细说明创建过程:

右键工程->创建model-> 选择spring initialir 如下图:

下一步->选择cloud discovery->eureka server ,然后一直下一步就行了。

创建完后的工程,其pom.xml继承了父pom文件,并引入spring-cloud-starter-netflix-eureka-server的依赖,代码如下:



4.0.0

<groupId>com.forezp</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-server</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>com.forezp</groupId>
    <artifactId>sc-f-chapter1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

public static void main(String[] args) {
    SpringApplication.run( EurekaServerApplication.class, args );
}

}
**2.4 **eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。eureka server的配置文件appication.yml:

server:
port: 8761

eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
application:
name: eurka-server
通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.

2.5 eureka server 是有界面的,启动工程,打开浏览器访问:
http://localhost:8761 ,界面如下:

No application available 没有服务被发现 ……_
因为没有注册服务当然不可能有服务被发现了。

三、创建一个服务提供者 (eureka client)
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。

创建过程同server类似,创建完pom.xml如下:



4.0.0

<groupId>com.forezp</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>service-hi</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>com.forezp</groupId>
    <artifactId>sc-f-chapter1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {

public static void main(String[] args) {
    SpringApplication.run( ServiceHiApplication.class, args );
}

@Value("${server.port}")
String port;

@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "forezp") String name) {
    return "hi " + name + " ,i am from port:" + port;
}

server:
port: 8762

spring:
application:
name: service-hi

eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/


需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
启动工程,打开http://localhost:8761 ,即eureka server 的网址:

你会发现一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为7862

这时打开 http://localhost:8762/hi?name=forezp ,你会在浏览器上看到 :

hi forezp,i am from port:8762
————————————————
原文链接:https://blog.csdn.net/forezp/article/details/81040925

【Spring Cloud】全家桶介绍(一)

一、微服务架构#

1、微服务架构简介#

  1.1、分布式:不同的功能模块部署在不同的服务器上,减轻网站高并发带来的压力。

  1.2、集群:多台服务器上部署相同应用构成一个集群,通过负载均衡共同向外提供服务。

  1.3、微服务:微服务架构模式就是将web应用拆分为一系列小的服务模块,这些模块可以独立地编译、部署,并通过各自暴露的API接口通讯,共同组成一个web应用。

  1.4、SpringCloud是基于SpringBoot的一整套微服务框架,提供了一系列可配置的组件,如配置管理服务发现负载均衡熔断器断路器智能路由微代理控制总线全局锁决策竞选分布式会话集群状态管理等。

2、微服务的特点#

  • 单一职责:每一个服务模块都对应单一的业务实现
  • 微:服务拆分的颗粒度很小
  • 面向服务:每个服务对外仅暴露服务接口API即可,不关心服务的技术实现,与技术、语言和平台无关
  • 自治:服务间互相独立、互不干扰
    • 团队独立
    • 技术独立:提供Rest接口,面向服务即可
    • 前后端分离
    • 数据库分离:每个服务使用自己的数据源
    • 部署独立:每个服务都是独立的组件,可复用,可替换,降低服务间的耦合

3、三者的关系#

微服务是一种结构理念,设计原则,提供理论指导;

Spring Boot专注于快速、方便集成的单个微服务个体,可以基于Spring Boot快速开发单个微服务;

Spring Cloud是一个基于Spring Boot实现的服务工具治理包,专注于全局的服务治理框架。

二、Spring Cloud#

1、Spring Cloud组件架构#

上图中各组件的组件和运行流程如下:

  • 所有请求都通过API网关来访问内部服务;
  • 网关接受请求后,从注册中心获取可用服务模块;
  • 由Ribbon进行负载均衡后,分发到后台的具体实例;
  • 各个服务模块之间通过Feign进行通信处理业务;
  • Hystrix负责处理服务超时熔断;
  • Turbine监控服务间的调用和熔断相关指标。

再来看一个具体实例上的Spring Cloud服务流程:

2、Spring Cloud组件简介#

2.1、主要组件简介#

  • Eureka,服务注册中心
  • Zuul,API服务网关
  • Config,分布式配置中心,支持本地仓库、SVN、Git、Jar包内配置等模式
  • Dashboard,Hystrix仪表盘,监控集群模式和单点模式,其中集群模式需要收集器Turbine配合
  • Ribbon,客户端负载均衡
  • Feign,声明式服务调用
  • Bus,消息总线

2.2、组件主要功能#

Eureka和Ribbon,一个注册服务,一个消费服务。

  Hystrix,为了优化Ribbon,防止整个微服务架构因为某个服务节点的问题导致崩溃,起到保险丝的作用。

Dashboard,给Hystrix统计和展示用,而且监控服务节点的整体压力和健康情况。

  Turbine,集群收集器,服务于Dashboard。

Zuul,加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,加强安全保护。

Config,为了解决所有微服务各自维护各自的配置,设置一个统一的配置中心,方便修改配置。

  Bus是因为config修改完配置后各个结点都要refresh才能生效实在太麻烦,所以交给bus来通知服务节点刷新配置的。

3、SpringCloud全家桶#

  1. 首先为了提供微服务之间的发现和注册,需要服务注册中心提供注册与发现功能,采用Eureka组件
  2. 消费者从注册中心拿到服务提供者的注册地址信息列表,为了从中选择一个提供方,避免流量集中在某台机,需要客户端负载均衡组件Ribbon
  3. 消费者得到具体提供方的地址信息后,发起远程调用,通过声明式调用组件Feign,将远程RestFul调用封装成接口调用。
  4. 在微服务架构中,为了避免某个服务挂掉后引起服务雪崩,以及做到服务端失败后快速响应,提供了服务熔断以及降级机制Hystrix组件
  5. 为了对外屏蔽内部服务调用细节,在最前沿加入网关组件,提供流量控制、身份鉴别、负载均衡等安全防护功能,采用API网关Zuul组件
  6. 随着系统访问量的增加,为避免单点的注册中心成为系统性能瓶颈,注册中心采用Eureka集群方式部署。
  7. 随着系统扩大,Eureka集群的部署以及服务模块的增多,每个模块维护各自的配置信息,复杂且容易出错,引入配置中心SpringCloud Config组件,提供统一的配置信息管理。
  8. 为了避免每次配置信息的变更都需要重启服务才能生效,引入消息总线Bus组件,提供无需重启、实时刷新配置信息等功能。