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 地址

1. 项目构建

新建模块化的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>

2. 服务发现 Discovery Server

pom 依赖

    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>com.abel</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <!--服务发现-->
    <artifactId>discovery</artifactId>

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

服务启动类 DiscoveryApplication

package com.abel;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * Created by yangyibo on 2018/6/27.
 * 服务发现 一个常规的springboot 项目,只需要通过 @EnableEurekaServer 注解开启对EurekaServer 的支持即可
 */
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryApplication.class,args);
    }
}

云计算环境下习惯用yaml配置,这里我们也用yaml 配置

application.yml

在resource 下新建application.yml 文件 内容如下:

#云计算环境下习惯使用YAML 配置此处我们也是用YAML 配置
server:
  port: 8761

eureka:
  instance:
      #当前Eureka Server 的hostname 为 localhost
    hostname: localhost
      #当前服务不需要到Eureka Server  上注册
  client:
    register-with-eureka: false
    fetch-registry: false

3. 服务配置

pom依赖

parent>
        <artifactId>springCloud</artifactId>
        <groupId>com.abel</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config</artifactId>

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

服务启动类 ConfigApplication

package com.abel;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * Created by yangyibo on 2018/6/27.
 * 配置模块
 */
@SpringBootApplication
//开启配置服务器的支持
@EnableConfigServer
//开启Eureka server 作为客户端的支持
@EnableEurekaClient
public class ConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApplication.class,args);
    }
}

配置 application.yml 和bootstrap.yml

application.yml

spring:
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/config #配置其他所需的配置文件的路径

server:
  port: 8888

bootstrap.yml

spring:
  application:
    name: config #在Eureka server 注册的服务名为config
  profiles:
    active: native # 配置服务器使用本地配置(默认为git 配置)

eureka:
  instance:
    non-secure-port: ${server.port:8888} #非ssl 端口,若环境变量中server.port有值,则使用环境变量的值,没有则使用8080
    metadata-map:
      instanceId: ${spring.application.name}:${random.value} #配置在Eureka server 的实例id
  client:
    service-url:
      defaultZone: http://${eureka.host:localhost}:${eureka.port:8761}/eureka/ #Eureka 客户端设置的 Eureka server 地址
  • 注意在配置服务config 的resource 下config文件夹内放服务的配置文件

剩余部分在 SpringBoot 之 SpringCloud 实战(二)

展开阅读全文
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值