SpringBoot 之 SpringCloud 实战

微服务、原生云应用

微服务(Microservice)是近两年来非常火的概念,他的含义是:定义好边界的小的独立组件来做好一件事情。微服务是相对于传统单块式架构而言的。

单块式架构是一份代码,部署和伸缩都是基于单个单元进行的,它的优点是易于部署,但是面临着可用性低,可伸缩性差、集中发布的生命周期以及违反单一功能原则。微服务的出现解决了这个问题,它以单个独立的服务来做的一个功能,且要做好这个功能。但使用微服务不可比避免的将功能按照边界拆分为单个服务,体现出分布式的特征,这时每个微服务之间的通信将是我们要解决的问题。

SpringCloud 为我们解决了分布式开发常遇到问题,给出了完整的解决方案。SpringCloud 基于springboot 为我们提供了 配置管理、服务发现、断路器、代理服务等我们在分布式开发时常遇问题的解决方案。

基于SpringCloud开发的程序特别适合在Docker 或者其他专业Pass(平台即服务,如Cloud Foundry)部署,所以又称作原生云应用。

SpringCloud quick start

SpringCloud应用 主要分为以下几个部分

配置服务

SpringCloud 提供了Config Server,它有在分布式系统开发中外部配置的功能。通过Config Server,我们可以集中的存储所有应用的配置文件。

Config Server支持在git 或者文件系统中放置文
件。

springCLoud 提供了注解@EnabelConfigServer来启动配置服务

服务发现

springCloud 通过Netfix OSS 的Eureka 来实现服务发现,服务发现的主要目的是为了让每个服务之间可以相互通信,Eureka Server 为微服务注册中心。

SpringCloud 使用注解的方式提供了 Eureka 服务端(@EnableEurekaServer) 和客户端(@EnableEurekaClient)。

路由网关

路由网关的主要目的是为了让所有的微服务对外只有一个接口,我们只是需要访问一个网关地址,即可由网关将我们的请求代理到不同的服务中。

SpringCloud 是通过Zuul来实现的,支持自动路由映射到在Eureka Server 上注册的服务。SpringCloud 提供了注解@EnableZuulProxy 来启用路由代理。

负载均衡

SpringCLoud提供了Ribbon和Feign 作为客户端的负载均衡。在SpringCloud 下,使用Ribbon 直接注入一个RestTemplate对象即可,此Restemplate 已做好负载均衡的配置;而使用Feign只需定义个注解,有@FeignClien他注解的接口,然后使用@RequestMapping 注解在方法上映射远程REST服务。此方法也是做好负载均衡配置的。

断路器 Circuit Breaker

断路器(Circuit Breaker) 主要是为了解决当某个方法调用失败的时候,调用后备方法来替代失败的方法,以达到容错,阻止级联错误等功能。

SpringCloud使用@EnableCircuitBreaker;来启用断路器支持,使用@HystrixCommand的fallbackMethod 来指定后备方法。

spring Cloud 还给我们提供了一个控制台来监控断路器运行情况。通过@EnabelHystrixDashboard注解开启。

实战

实战主要分为6个微服务组成:

  • config:配置服务器,本例中为person-service和some-service提供外部配置。
  • discovery:EurekaServer为微服务提供注册。
  • person:为UI 模块提供保存person的REST服务。
  • some:为UI模块返回一段字符串。
  • UI:作为应用网关,提供外部访问的唯一入口,使用* Feign消费person服务、Ribbon消费some服务、且都提供断路器功能;
  • monitor:监控UI模块中的断路器

本例只有部分核心代码,完整代码请见文章末尾Git 地址

项目构建

新建模块化的mavne 项目 springCloud 其父模块的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.abel</groupId>
    <artifactId>springCloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>config</module>
        <module>discovery</module>
        <module>ui</module>
        <module>person</module>
        <module>some</module>
        <module>monitor</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!-- 替换 spring-boot-starter-parent 为 cloud-->
    <parent>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-parent</artifactId>
        <version>Angel.SR3</version>
        <relativePath/>
    </parent>

    <!--公共依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.2.9</version>
                    <configuration>
                        <skipDockerBuild>true</skipDockerBuild>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>

服务发现 Discovery Server

未完待续。。。。

猜你喜欢

转载自blog.csdn.net/u012373815/article/details/80865524