springCloud框架

 Spring Cloud简介

Spring Cloud 是在Spring Boot 的基础上构建的,用于简化分布式系统构建的工具集。该工具集为微服务架构中所涉及的配置管理、服务发现、智能路由、断路器、微代理和控制总线等操作提供了一种简单的开发方式。

Spring Cloud的特点


Spring Cloud有很多特点,其中最大的特点就是它的集成性,它将很多开源产品都集成到了自身的框架中,使其越来越强大。

除此之外,Spring Cloud还有如下特点。


1.使用方便

在使用时,开发人员不需要过多的配置,也不需要调用很多接口,通过简单的配置即可轻松上手。

2.功能齐全


Spring Cloud涵盖了微服务架构中的各个方面,集成了很多公司优秀的开源框架,能够充分满足微服务开发者的各项需求。


3.易于扩展和维打


所有组件的引入方式相同,都是通过 Maven或Gradle引入依赖。各个组件之间没有代码上的耦合,因此可以根据需求不断地增加、删除和替换组件。


4.适用于各种环境

使用 Spring Cloud 组件开发的项目可以应用于 PC 服务器、云环境,以及各种容器(如Docker )。

1. Eureka 


 Eureka 是Netlix开发的一个服务发现框架,本身是一个基于REST的服务,主要用于定位运行在 AWS(Amazon Web Services)域中的中间层服务,以达到负载均衡和中间层服务故障 转移的目的。Spring Cloud将其集成在自己的子项目 Spring Cloud Netlix中,以实现 Spring| Cloud 的服务发现功能。


Eureka 的服务发现包含两大组件:服务端发现组件(Eureka Server)和客户端发现组件(Eureka Client )。服务端发现组件也被称之为服务注册中心,主要提供了服务的注册功能,而客户端发现组件主要用于处理服务的注册与发现。

使用Eureka 注册服务

1.搭建Maven父工程

<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.itheima</groupId>
    <artifactId>microservice-springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>
            UTF-8
        </project.build.sourceEncoding>
        <project.reporting.outputEncoding>
            UTF-8
        </project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!--         <dependency> -->
        <!--             <groupId>org.springframework.cloud</groupId> -->
        <!--             <artifactId>spring-cloud-starter-config</artifactId> -->
        <!--         </dependency> -->
        <!--         <dependency> -->
        <!--             <groupId>org.springframework.boot</groupId> -->
        <!--             <artifactId>spring-boot-devtools</artifactId> -->
        <!--         </dependency> -->
    </dependencies>
    <build>
        <plugins>
            <!--Spring Boot的编译插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.搭建服务端工程

(1)添加依赖。在 pom.xml中添加Eureka Server的依赖

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-eureka-server</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>
</project>

(2)编写配置文件。在配置文件application.yml中增加端口号等配置信息

server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# server:
# enable-self-preservation: false

(3)修改服务端 Java代码。在项目的引导类上添加注解@EnableEurekaServer,该注解用声明标注类是一个Eureka Server

@EnableEurekaServer
@SpringBootApplication
public class MicroserviceEurekaServerApplication {

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

}

(4)启动应用,查看信息。完成上述配置后,启动应用程序并在浏览器中访问地士http://localhost:8761/

3.搭建客户端工程

1)添加依赖

 

<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>
  <parent>
    <groupId>com.itheima</groupId>
    <artifactId>microservice-springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservice-config-client</artifactId>
  <dependencies>
      <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</
dependency> </dependencies> </project>

 

(2)编写配置文件

server:
    port: 8000 #指定该Eureka实例的端口号
    eureka:
      instance:
        prefer-ip-address: true #显示主机IP地址
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/  # 指定 Eureka服务端地址
    application:
      name: microservice-eureka-user   #指定应用名称

(3)修改客户端 Java 代码 。在项目的引导类上添加注解@EnableEurekaClient,该注解.
明标注类是一个 Eureka 客户端组件

 

3.搭建订单服务

(1)在 pom.xml中添加 spring-cloud-starter-eureka 依赖

 

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-eureka-order</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>
</project>

 

(2)编写配置文件。在配置文件中添加 Eureka服务实例的端口号、服务端地址等信息

 

server:
  port: 7901 # 指定该Eureka实例的端口号
eureka:
  instance:
    prefer-ip-address: true  # 是否显示主机的IP
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # 指定Eureka服务端地址
spring:
  application:
    name: microservice-eureka-order # 指定应用名称

(3)在引导类中加入@EnableEurekaClient

(4)在microservice-eureka-user 工程的引导类中,创建 RestTemplate

RestTemplate是 Spring提供的用于访问 Rest服务的客户端实例,它提任了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

 

@SpringBootApplication
@EnableEurekaClient
@RestController
public class Application {
    @RequestMapping("/hello")
    public String home() {
        return "hello world!";
    }
    /**
     * 实例化RestTemplate
     * RestTemplate是Spring提供的用于访问Rest服务的客户端,
     * 它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
}

 

@RestController
public class UserController {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 查找与用户相关的订单
     */
    @GetMapping("/findOrderByUser/{id}")
    public String findOrderByUser(@PathVariable String id) {
        int oid = 123;
        return this.restTemplate.getForObject("http://microservice-eureka-order/order/" + id, String.class);
    }
}

 在上述代码中,当用户查询订单时,首先会通过用户id 查询与用户相关的所有订单(由于这里主要是演示服务的调用,所以省略了查询方法,并且自定义了一个oid为123的订单,来模拟查询出的结果)。然后通过 restTemplate 对象的getForObject()方法调用了订单服务中的查询订单方法来查询订单id为123的订单信息。

客户端负载均衡

 

在分布式架构中,服务器端负载均衡通常是由Nginx 实现分发请求的,而客户端的同一个实例部署在多个应用上时,也需要实现负载均衡。通过 Spring Cloud中的 Ribbon 来实现此功能。

Ribbon 介绍

Ribbon是Netlix发布的开源项目,其主要功能是提供客户端的软件负载均衡算法,将Netlix的中间层服务连接在一起。Ribbon 的客户端组件提供了一系列完善的配置项,例如连接超时、重试等。
在 Eureka的自动配置依赖模块 spring-cloud-starter-eureka中,已经集成了Ribbon,我们可以直接使用 Ribbon来实现客户端的负载均衡。
二者同时使用时,Ribbon 会利用从 Eureka 读取到的服务信息列表,在调用服务实例时,以合理的方式进行负载。

Ribbon的使用

在 Eureka 中使用 Ribbon 十分简单,只需要在实例化 RestTemplate 的方法上添加@LoadBalanced 注解,并在其执行方法中使用服务实例的名称即可。

具体实现过程如下:

(1)添加@LoadBalanced 注解。在 microservice-eureka-user 工程引导类中的restTemplate()方法上添加@LoadBalanced 注解,

@SpringBootApplication
@EnableEurekaClient
@RestController
public class MicroserviceEurekaUserApplication {
    @RequestMapping("hello")
    public String hello() {
        return "欢迎光临";
    }

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


    /*访问Rest服务的客户实例
     * RestTemplate是spring提供的用于访问rest服务的客户端
     * 提供了便捷访问远程Http服务方法,提高效率
     * */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
@RestController
public class UserController {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 查找与用户相关的订单
     */
    @GetMapping("/findOrderByUser/{id}")
    public String findOrderByUser(@PathVariable String id) {
        int oid = 123;
        /*加入负载均和localhost:7900/order可以改成microservice-eureka-order*/
        return this.restTemplate.getForObject("http://microservice-eureka-order/order/" + id, String.class);
    }
}

(2)创建服务监听类ServiceInfoUtil.java

在microservice-eureka-order工程中创建一个用于监听服务实例端口的工具类 ServicelnfoUtil。

@Configuration
public class ServiceInfoUtil implements ApplicationListener<EmbeddedServletContainerInitializedEvent> {
    /*声明event对象,EmbeddedServletContainerInitializedEvent
    用于获取运行服务器的本地端口
    * */
    private static EmbeddedServletContainerInitializedEvent event;

    @Override
    public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
        ServiceInfoUtil.event = event;

    }

    /*获得端口号*/
    public static int getPort() {
        return event.getEmbeddedServletContainer().getPort();
    }
}

(3)添加输出语句。在订单控制器类 OrderController的查询订单方法中,增加一行执行输出当前实例端口号的语句。具体如下:
 System.out.println(ServiceInfoUtil.getPort());

Spring Cloud Hystrix

在微服务架构中,通常会存在多个服务层调用的情况,如果基础服务出现故障可能会发生级联传递,导致整个服务链上的服务不可用pring Cloud Hystrix就是用来实现断路器、线程隔离等服务保护功能的。Spring Cloud Hystrix是基于Netlix的开源框架 Hystrix 实现的,该框架的使用目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

(1)创建microservice-eureka-user-hystrix工程添加依赖

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-eureka-user-hystrix</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- Hystrix依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-core</artifactId>
            <version>1.5.12</version>
        </dependency>
    </dependencies>
</project>

(2)配置文件

server:
  port: 8030 # 指定该Eureka实例的端口号
eureka:
  instance:
    prefer-ip-address: true  # 是否显示主机的IP
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # 指定Eureka服务端地址
spring:
  application:
    name: microservice-eureka-user-hystrix # 指定应用名称

(3)在启动类上加入@EnableCircuitBreaker开启熔断机制

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class MicroserviceEurekaUserHystrixApplication {
    /*访问Rest服务的客户实例
     * RestTemplate是spring提供的用于访问rest服务的客户端
     * 提供了便捷访问远程Http服务方法,提高效率
     * */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

}

(4)修改用户控制器类。在findOrdersByUser()方法上添加@HystrixCommand注解来指回调方法

@RestController
public class UserController {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 查找与用户相关的订单
     */
    @GetMapping("/findOrderByUser/{id}")
    @HystrixCommand(fallbackMethod = "fallbackInfo")
    public String findOrderByUser(@PathVariable String id) {
        /*加入负载均和localhost:7900/order可以改成microservice-eureka-order*/
        return this.restTemplate.getForObject("http://microservice-eureka-order/order/" + id, String.class);
    }

    /*返回信息*/
   public String fallbackInfo(@PathVariable String id) {
        return "服务器不可用,请稍后再试!";
    }
}

@HystrixCommand 注解用于指定当前方法发生异常时调用的方法,该方法是通过其属性 fallbackMethod 的属性值来指定的。这里需要注意的是,回调方法的参数类型以及返回值必须要和原方法保持一致。

 Hystrix Dashboard 的使用

Hystrix 除了可以对不可用的服务进行断路隔离外,还能够对服务进行实时监控。Hystrix 可以实时、累加地记录所有关于 HystrixCommand 的执行信息,包括每秒执行多少、请求成功多少、失败多少等。

1.加入实时监控的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在 microservice-eureka-user-hystrix 工程的 pom.xml中引入上述依赖后,即可查看监控信息,具体操作步骤如下。


(1)分别启动注册中心、服务提供者(7901)和服务消费者工程。

  
(2)通过浏览器访问地址 http://ocalhost:8030/findOrdersByUser/1(此步骤不可省略,否则将由于系统应用的所有接口都未被调用,而只输出 ping:)。


(3)通过浏览器访问地址 http://localhost:8030/hystrix.stream,将看到如图5-7所示的输出
信息。

 

 访问具体地址后,浏览器会不断地执行刷新操作以获取实时的监控数据。这样运维人员就可以通过这些数据来判断出系统当前的监控状态。
虽然采用上面这种纯文字输出的方式可以实时监控数据,但其可读性十分差。为此,我们可以通过 Hystrix Dashboard 以可视化的方式来查看实时监控数据。Hystrix Dashboard是Hystrix的一个组件,它提供了数据监控和友好的图形化界面支持。

(1)新建 microservice-springcloud 的子工程 microservice-hystrix-dashboard,在pom.xml文件中添加监控依赖和Hystrix Dashboard 依赖

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-hystrix-dashboard</artifactId>
    <properties>
        <project.build.sourceEncoding>
            UTF-8
        </project.build.sourceEncoding>
        <project.reporting.outputEncoding>
            UTF-8
        </project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>
                spring-cloud-starter-hystrix-dashboard
            </artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
</project>

(2)编写配置文件 application.yml,指定应用的端口号和名称等信息

server:
  port: 8031 # 指定该Eureka实例的端口号
spring:
  application:
    name: microservice-hystrix-dashboard # 指定应用名称

(3)编写启动类 Application.java,并在其类上添加@EnableHystrixDashboard 注解来开启Hystrix 仪表板功能

@SpringBootApplication
//开启Hystrix仪表板功能
@EnableHystrixDashboard
public class MicroserviceHystrixDashboardApplication {

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

}

(4)启动工程后,通过浏览器访问地址 http:/localhost:8031/hystrix.stream 将会看到如图5-8所示的信息.
在图5-8中,Hystrix Dashboard下的输入框用于输入需要监控的服务 URL,Delay 中的参数表示服务器上的轮询时间间隔,Title中的输入框用于设置浏览器中所监视服务的标题。
在Hystrix Dashboard 下的输入框中输入 http://ocalhost:8030/hystrix.stream,并设置 Title为"订单微服务"后,单击【Monitor Stream】按钮,将出现如图5-9所示页面。

 

 

 

 在Hystrix Dashboard Wiki上已经给出了详细说明,可访问地址 https:/github.com/Netlix/Hystrixwiki/Dashboard 查看

 API 网关服务

使用Spring Boot 实现微服务的开发,使用 Spring Cloud Eureka实现注册中心以及服务的注册与发现,使用Spring Cloud Ribbon 实现服务间的负载均衡,使用 Spring Cloud Hystrix 实现线程的 隔离和断路器功能。

 

 在图5-11中,集群包含了Service A和 Service B两种服务,它们会向 Eureka Server注册和订阅服务,Open Service是一个对外的 RESTul API服务,客户端会通过负载均衡技术(如Nginx)实现对Open Service的调用,同时服务之间也会通过Ribbon技术实现服务之间负载均衡的调用。
虽然通过这种方式实现系统功能是没有问题的,但在实际使用时,客户端与微服务进行直接的交互还是存在着一些困难和限制的,具体表现如下。


1.增加开发和维护成本


在大多数情况下,为了保证对外服务的安全性,开发人员在服务端实现的服务接口会有一定的权限校验机制(如用户登录状态校验等),并且为了防止客户端在发起请求时被篡改等安全方面的考虑,还会编写一些签名校验功能。在微服务中,我们会将原来处于一个应用中的多个模块 拆分成多个应用服务,而这些拆分出来的应用服务接口也需要原来的校验逻辑,这就导致我们不得不在这些应用中全部实现这样的一套逻辑。随着微服务规模的不断扩大,这些校验逻辑的冗余将越来越多,一旦校验规则有了变化或者出了问题,我们将不得不去每一个应用中修改这些逻辑。


2.微服务重构困难


随着时间的推移,我们可能需要改变系统服务目前的拆分方案(如将两个服务合并或将一个服务拆分为多个),但如果客户端直接与微服务交互,那么这种重构就很难实施。

3.微服务协议限制


客户端直接请求的微服务可能使用的是与Web无关的协议。一个服务可能是用Thrift的RPC协议,而另一个服务可能是用 AMQP消息协议,两种协议都不是特别适合浏览器或防火墙,最好是内部使用。应用应该在防火墙外采用HTTP或者 WEB Socket 之类的协议。

通常来说,一个很好的解决办法就是采用 APIGateway(网关)的方式。API Gateway是一个服务器,也可以说是进入系统的唯一节点,它封装了内部系统的架构,并且提供了API给各个客户端。它还可以有其他功能,如授权、监控、负载均衡、缓存、请求分片和管理、静态响应处理等。

 

 在图5-12中,APIGateway 负责请求转发、合成和协议转换。所有来自客户端的请求都要先经过 API Gateway,然后负载均衡这些请求到对应的微服务
APIGateway的一个最大好处是封装了应用的内部结构,与调用指定的服务相比,客户端直接跟 Gateway 交互会更简单。API Gateway 提供给每一个客户端一个特定 APl,这样减少了客户端与服务器端的通信次数,也简化了客户端代码。API Gateway还可以在Web协议与内部使用的非Web协议间进行转换,如HTTP协议、WebSocket协议。
API Gateway 可以有很多实现方法,如Nginx、Zuul、Node.js

4.使用Zuul 构建 API网关服务

Spring Cloud中。Zuul 属于边缘服务,可以用来执行认证、.动态路由、服务迁移、负载均衡。

(1)创建工程,添加依赖。在父工程 microservice-springcloud 下创建子模块 microservice-gateway-zuul工程,并在其 pom.xml中添加 eureka和Zuul 的依赖

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-gateway-zuul</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-client</artifactId>
            <version>1.3.4.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>
</project>

(2)编辑配置文件。在配置文件中编写Eureka服务实例的端口号、服务端地址等信息

server:
  #指定该Eureka实例的端口号
  port: 8050
    #eureka:
    #instance:
    #prefer-ip-address:  true # 是否显示主机的IP
    #client:
    #service-url:
  #defaultZone: http://localhost:8761/eureka/  # 指定Eureka服务端地址
spring:
  application:
    name: microservice-gateway-zuul # 指定应用名称
zuul:
  routes:
    #order-serviceId:    # zuul的唯一标识,可以任意设置名称,但必须唯一,如果该值与service-id的名称相同时,service-id的值可以省略
    # 需要映射的路径
    #path: /order/**
    # Eureka中的serviceId
    #service-id: microservice-eureka-order
    order-url:
      path: /order-url/**
      url: http://localhost:7900/
      #ignored-services:

 

 (3)在工程主类 Application中使用@EnableZuulProxy 注解开启Zuul的API 网关功能,

@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class MicroserviceGatewayZuulApplication {

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

}

(4)分别启动注册中心、服务提供者和网关服务后,注册中心已注册的服务

 Zuul 的单独使用
上面的示例中,我们是将 Spring CloudZuul与 Spring Cloud Eureka 整合在一起使用的,此种方式可以让路由映射到具体服务。除此之外,Zul还可以不依赖 Eureka而单独使用。

order-url为Zul 的唯一标识,可以任意设置名称,但必须唯一。Path属性用于设置需要映射的路径,而url的属性值为path路由到的地址。

分布式配置管理

在传统的单体式应用系统中,我们通常会将配置文件和代码放在一起,但随着系统越来越大,需要实现的功能越来越多时,我们又不得不将系统升级为分布式系统,同时也会将系统的功能进行更加细化的拆分。拆分后,所有的服务应用都会有自己的配置文件,当需要修改某个服务的配| 置时,我们可能需要修改很多处,并且为了某一项配置的修改,可能需要重启这个服务相关的所|有服务,这显然是非常麻烦的。
为了便于集中配置的统一管理,在分布式架构中通常会使用分布式配置中心组件,目前比较流行的分布式配置中心组件有百度的disconf、阿里的 diamond、携程的apollo和Spring Cloud 的Config等。相对于同类产品而言,Spring Cloud Config 最大的优势就是和Spring的无缝集成,对于已有的 Spring 应用程序的迁移成本非常低,结合Spring Boot 可使项目有更加统一的标准(包括依赖版本和约束规范),避免了因集成不同开发软件造成的版本依赖冲突等问题。

Spring Cloud Config是 Spring Cloud团队创建的一个全新的项目,该项目主要用来为分布式系统中的外部配置提供服务器(Config Server)和客户端(Contig Client)支持。


●服务器端(Config Server):也被称之为分布式配置中心,它是一个独立的微服务应用,主要用于集中管理应用程序各个环境下的配置,默认使用Git 存储配置文件内容,也可以使用SVN存储,或者是本地文件存储。


●客户端(Config Client):是Contig Server 的客户端,即微服务架构中的各个微服务应用。
 它们通过指定的配置中心(Config Server)来管理应用资源以及与业务相关的配置内容,并在启|动时从配置中心获取和加载配置信息。

 

 

 1.搭建 Config Server

(1)创建配置中心工程microservice-config-server,并在其 pom.xml中引入 Config Server的依赖

 

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-config-server</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>
</project>

 

(2)编写配置文件application.yml,添加服务端口号和存储属性等信息

 

 

spring:
  application:
    name: microservice-config-server
    profiles:
      active: native   # 使用本地文件系统的存储方式来保存配置信息
server:
  port: 8888

 

(3)创建3个分别用于表示开发、预发布和测试的资源配置文件

 

 

● application-dev.yml 中编写内容:clientParam:native-dev-1.0

clientParam: native-dev-1.0

 

●application-prod.yml 中编写内容:clientParam: native-prod-1.0

clientParam: native-prod-1.0

 

●application-test.yml中编写内容:clientParam: native-test-1.0

clientParam: native-test-1.0

 

 (4)创建启动类,并在类上增加@EnableConfigServer注解以开启服务端功能

 

 

@EnableConfigServer
@SpringBootApplication
public class MicroserviceConfigServerApplication {

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

}

 

(5)启动工程,测试应用。应用启动成功后,按照如下格式的URL发起请求:http://localhost:8888/(applicationname)/{env}/{label}

 

 

 

 

2.搭建 Config Client

(1)创建客户端工程microservice-config-client,并在其 pom.xml中添加 Config 和的依赖

<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>
    <parent>
        <groupId>com.itheima</groupId>
        <artifactId>microservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-config-client</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        
    </dependencies>
</project>

(2)编写配置文件 bootstrap.yml,在其中配置应用名称、服务中心地址、需要访问的文件和端口号等信息

spring:
  application:
    name: microservice-config-client
  cloud:
    config:
      profile: prod
      uri: http://localhost:8888/
server:
  port: 8801
management:
  security:
    enabled: false

(3)创建启动类,并在类上添加@RestController 注解

@SpringBootApplication
@RestController
public class MicroserviceConfigClientApplication {
    @Value("${clientParam}")
    private String clientParam;

    @RequestMapping("/clientParam")
    public String getClientParam() {
        return this.clientParam;
    }

    @RequestMapping("/hello")
    public String hello() {
        return "欢迎光临";
    }


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

}

(4)测试应用是否能够正常访问,应用启动成功后,可以通过地址 http:/localhost:8801/hello测试应用

 使用Git存储的方式实现配置管理

 (1)配置 Git。在Git上创建microservice-study-config目录,并在目录中增加开发、预发布和测试的配置文件。

 ●application-dev.yml中编写内容:clientParam: git-dev-1.0

●application-prod.yml 中编写内容:clientParam:git-prod-1.0

●application-test.yml中编写内容:clientParam: git-test-1.0

(2)修改服务端配置文件。

spring:
  application:
    name: microservice-config-server
  cloud:
    config:
      server:
        git: # 使用git的方式
          uri: https://gitee.com/secret8/microservice-study-config.git
server:
  port: 8888

(3)修改客户端配置文件。

spring:
  application:
    name: microservice-config-client
  cloud:
    config:
      profile: prod
      label: master
      uri: http://localhost:8888/
server:
  port: 8801

(4)启动工程,测试应用。

 

 

 手动更新运行中的配置文件

1)在客户端的 pom.xml中添加依赖

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

2)在启动类上添加@RefreshScope 注解,开启refresh机制。添加此注解后,在执行/refresh时会更新该注解标注类下的所有变量值,包括 Config Client从Git 仓库中所获取的配置

management:
  security:
    enabled: false

 

 

 

 

 

posted @ 2020-05-03 10:47  苏先生139  阅读(381)  评论(0编辑  收藏  举报