嘘~ 正在从服务器偷取页面 . . .

SpringCloud 微服务学习


SpringCloud 微服务学习

相关链接:

一、关于微服务

1、马丁福勒

微服务提出人,马丁.福勒(Martin Fowler) 这样描述微服务:
论文网址: https://martinfowler.com/articles/microservices.html

微服务架构是⼀种架构模式,它提倡将单⼀应⽤程序划分成⼀组⼩的服务,服务之间互相协调、互相配合,为⽤户提供最终价值。每个服务运⾏在其独⽴的进程中,服务与服务间采⽤轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。每个服务都围绕着具体业务进⾏构建,并且能够被独⽴的部署到⽣产环境、类⽣产环境等。另外,应当尽量避免统⼀的、集中式的服务管理机制,对具体的⼀个服务⽽⾔,应根据业务上下⽂,选择合适的语⾔、⼯具对其进⾏构建。

2、定义与思想

强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题的实际服务请求对应服务的一个服务应用,可以看作Eclipse里面的一个个微服务工程/或者Module。

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。

微服务核心思路就是分而治之。

对于微服务中的服务可以这么理解:服务是一个可以独立运行、提供范围有限的功能(可以是业务功能,也有可能是非业务功能)的组件。

3、优缺点

微服务架构的优缺点

优点缺点
松耦合(一系列的小服务集合)可用性降低(远程调用可能会不稳定,善处链路雪崩)
抽象(调用某服务才能修改数据)分布式事务棘手
独立(独立编译、打包、部署)全能对象阻碍业务拆分(某些对象参与较多业务模块)
更高可用性和弹性(各自上下线)学习难度曲线加大
组织架构变更

4、交互原则

微服务交互主流基本原则:

(1)使用REST协议,并使用HTTP作为服务调用协议,使用标准动词(GET/PUT/POST/DELETE)

(2)使用URI表达出要解决的问题、提供的方法、资源与资源的关系

(3)使用JSON数据格式(轻量级数据格式、自带序列化和反序列化)

(4)使用HTTP标准状态码

5、微服务架构

微服务架构

6、主要技术栈

微服务的主要技术栈:

微服务条目主流技术
服务开发Springboot、Spring、SpringMVC
服务配置与管理Netflix公司的Archaius、阿里的Diamond等
服务注册与发现Eureka、Consul、Zookeeper、Nacos等
服务调用Rest、RPC、gRPC
服务熔断器Hystrix、sentinel、Envoy等
负载均衡Ribbon、Nginx等
服务接口调用(客户端调用服务的简化工具)Feign等
消息队列Kafka、RabbitMQ、ActiveMQ等
服务配置中心管理SpringCloudConfig、Nacos、Chef等
服务路由(API网关)Zuul、Geteway等
服务监控Zabbix、Nagios、Metrics、Spectator等
全链路追踪Zipkin,Brave、Dapper等
服务部署Docker、OpenStack、Kubernetes等
数据流操作开发包SpringCloud Stream(封装与Redis,Rabbit、Kafka等发送接收消息)
事件消息总线Spring Cloud Bus、Nacos等
……

二、关于SpringCloud

1、SpringCloud干什么的

SpringCloud,是基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。

SpringCloud利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等,它们都可以用SpringBoot的开发风格做到一键启动和部署。

SpringCloud 即分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶。

2、与spring boot

SpringCloud与SpringBoot

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系.

SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

3、与Dubbo相比

Dubbo与SpringCloud

Dubbo是高性能 RPC 的分布式服务,SpringCloud采用的是基于HTTP的REST方式。

SpringCloud提供了一整套的解决方案,Dubbo需要自己进行组装。

因为Dubbo还不够熟悉,对后续再补充。

三、SpringCloud

1、主要网站

SpringCloud 官网 https://spring.io/projects/spring-cloud

SpringCloud 中文网 http://springcloud.cc/

SpringCloud 中文社区 http://springcloud.cn/

2、SpringCloud 版本选择

SpringCloud 版本不是数字表示,是以字母命名,Axxx、Bxxx、Cxxx…..

当前的最新版本是:Spring Cloud Hoxton.SR8

搭配spring Boot的版本是2.2或2.3

以下推荐搭配表:

SpringCloud与SpringBoot 搭配
Release TrainBoot Version

Hoxton

2.2.x, 2.3.x (Starting with SR5)

Greenwich

2.1.x

Finchley

2.0.x

Edgware

1.5.x

Dalston

1.5.x

3、代码结构

有多个微服务,会有SpringBoot工程,springboot 较多的maven 依赖都是一致的,防止子工程引入依赖版本不一致问题,使用统一的父工程进行管理。

父工程 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xiaocai.springcloud</groupId>
  <artifactId>cloud2020</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>


  <!-- 统一管理jar包版本 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.16.18</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.version>1.1.16</druid.version>
    <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
  </properties>

  <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
  <dependencyManagement>
    <dependencies>
      <!--spring boot 2.2.2-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.2.2.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud Hoxton.SR1-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR8</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud alibaba 2.2.0.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.spring.boot.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <optional>true</optional>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

父工程创建完成执行mvn:install将父工程发布到仓库方便子工程继承。

子工程的 pom.xml根据需要引入依赖即可,可以省略版本号。



版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录