SpringCloud 框架基本模块梳理(一)

前言
本片文章作为本系列的初始,将会搭建 注册中心 和 网关 共两个服务,同时会从个人来阐述技术选型,欢迎讨论,轻喷。
一、环境&组件版本介绍
JDK 8, MAVEN 3, idea编译器
SpringBoot: 2.2.5.RELEASE
SpringCloud: Hoxton.SR3

二、搭建注册中心

1、技术选型

一提到分布式系统注册中心的技术选型,就会有人跟我提一下CAP(Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性))理论,然后会告诉我三者当中只能满足两种情况 要么CA要么CP,至于为啥,通常都是听的一知半解,我就不对这个理论发表什么看法了,毕竟年轻。

由于我接触的少,备选的方案不多,主要有:Zookeeper, Eureka, Consul(本系列会选取eureka和consul来搭建环境)关于3种技术的阐述,此处就简单聊聊,有兴趣问度娘。

Zookeeper: 主节点依赖,通信异常的时候可能会导致服务长时间不可用,在集群环境下的表现异常强大(这是个人感觉)且区分角色,通常分3种,集群数以3的倍数为佳

Eureka: 只要自身服务没问题,注册进来的服务挂不挂并不影响其他服务。

Consul: 只知道是大佬们的东西,目前没有过接触。

2、基本流程

本篇文章以eureka为注册中心,因为此时consul还在下载。

Idea创建一个干净的SpringCloud工程

整理一下项目结构

springcloud 多模块全局异常处理 springcloud模块划分_ci


pom文件,版本对应一下文章。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </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>

创建一个module,命名为eureka,
引入spring-cloud-starter-netflix-eureka-server依赖

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

启动项添加注解@EnableEurekaServer来表名身份
配置一下yml文件,没有就新建

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      default-zone: http://${eureka.instance.hostname}:${server.port}/eureka/
    healthcheck:
      enabled: true
  server:
    enable-self-preservation: true

截至目前,注册中心搭建完毕,可以启动访问一下。

3、效果展示

springcloud 多模块全局异常处理 springcloud模块划分_技术选型_02


[eureka截图]

三、搭建网关

1、技术选型

关于网关,备选的有zuul和gateway (还是了解的少了)此处我选择gateway,毕竟5.0了,也是要往前走走的。值得提一下的是,在Hoxton.SR3下,gateway有一个断言的特性(不知道之前的版本有没有)同时增加 RetryFilter, RouteDefinition, 以及支持低于 1 req/s 条件限流。

2、基本流程
再一次创建一个module, 命名为gateway,引入依赖(此处是重点,不要随便引入其他jar)

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <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-actuator</artifactId>
        </dependency>
    </dependencies>

配置yml文件

server:
  port: 8888
spring:
  profiles:
    active: path-route      #使用哪个配置文件
  application:
    name: gateway    #服务名
  cloud:
    #设置路由规则
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id:  apiuser
          # lb代表从注册中心获取服务
          uri: lb://provide
          predicates:
            # 以P开头的请求都将转发到uri设置的路由
            - Path=/p/**
          filters:
            - StripPrefix=1

这里着重介绍一下gateway的相关配置

discovery.locator.enabled : true

开启服务注册,配置可替代启动项@EnableEurekaClient

routes-id 唯一的路由规则标识

routes.uri 跳转的服务地址 1p://服务名 -> 可以从注册中心匹配服务

routes.predicates-Path 断言规则— eg: - Path=/p/** 表示以P开头的请求都将转发到uri设置的路由

截至目前,网关gateway搭建完毕,可以启动访问一下。

3、效果展示

为了验证网关, 我这边创建了一个简单的服务,输出 Hello World。

springcloud 多模块全局异常处理 springcloud模块划分_ci_03


直接访问服务

springcloud 多模块全局异常处理 springcloud模块划分_技术选型_04


网关访问服务

springcloud 多模块全局异常处理 springcloud模块划分_技术选型_05

四、本篇结束