# SpringCloud(五)Zuul网关与Config配置
# 1. Zuul:路由网关
**什么是Zuul**
Zuul包含了对请求的路由的过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进程干预,是实现请求校验,服务聚合的功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka
提供:代理 + 路由 + 过滤 三大功能
**Zuul能干什么**
* 路由
* 过滤
官网文档:http://github.com/Netflix/zuul
* 创建先的module:**springcloud-zuul-9527**
* 添加pom.xml依赖
```xml
<dependencies>
<!--Zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--Dashboard,Hystrix监控页面-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--实体类-->
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web依赖-->
<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>
```
* 创建主启动类:**ZuulApplication_9527.java**
```java
@SpringBootApplication
@EnableZuulProxy // 开启代理
public class ZuulApplication_9527 {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication_9527.class,args);
}
}
```
* 创建application.yml
```yml
server:
port: 9527
spring:
application:
name: springcloud-zuul
eureka:
client:
# 服务集群地址
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
instance:
instance-id: zuul9527.com
prefer-ip-address: true
```
* 依次启动7001、hystrix-8001、9527
* 访问:http://localhost:9527/springcloud-provider-dept/dept/get/1
* 拿到数据
* 这样会直接暴露微服务名称
* 修改application.yml
```yml
zuul:
# 配置路由
routes:
# 原访问路径
mydept.serviceId: springcloud-provider-dept
# 新访问路径
mydept.path: /mydept/**
# 隐藏全部微服务名
ignored-services: "*"
# 设置公共的前缀
prefix: /levn
```
* 访问:http://localhost:9527/levn/mydept/dept/get/1
* 拿到数据
* 说明网关配置成功
> 总结:zuul路由的的作用是配置访问地址,隐藏真实服务地址,同时可以过滤一些请求。
# 2. Config:Git环境搭建
**分布式系统面临的--配置问题的问题**
微服务意味着要单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所有一套集中式的,动态的配置管理设施是必不可少的。
SpringCloud提供的ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百的配合文件要修改起来很麻烦。
**什么是SpringCloudConfig分布式配置中心**
SpringCloudConfig为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为**各个不同微服务应用**的所有环节提供了一个**中心化的外部配置**。
SpringCloudConfig分为**服务端**和**客户端**两部分。
服务端也称为 分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并位客户端提供获取配置信息、加密、解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理。并且可以用过git客户端工具来方便管理和访问配置内容。
**SpringCloudConfig分布式配置中心能干什么**
* 集中管理配置文件
* 不同环境,不同配置,动态化的配置更新,分环境部署,比如 /dev /test /prod /beta /release
* 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
* 当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置
* 将配置信息以REST接口的形式暴露
**SpringCloudConfig分布式配置中心与GitHub整合**
由于SpringCloudConfig默认使用git来存储配置文件(也有其他方式,比如支持SVN和本地文件),但是最推荐的还是git,而且使用的是HTTP/HTTPS访问的形式
* 电脑安装git,下载地址:https://git-scm.com/download/win
* 根据系统不同,自行选择
* 注册码云账号:https://gitee.com/
* 新建仓库
* 仓库名称:springcloud-config
* 仓库介绍:随便填写
* 是否开源:选择公开
* 选择语言:Java
* 添加.gitignore:Java
* 添加开源许可证:GPL 3.0
* 勾选使用Readme文件初始化这个仓库
* 点击:创建
* 将仓库文件拉取到本地
* 复制HTTPS的克隆地址
* 打开本地要存放的文件夹
* 鼠标右键,点击:Git Bash Here
* 输入:git clone 复制的克隆地址
* 回车
* 在克隆好的文件夹中新建application.yml
```yml
spring:
profiles:
active: dev
---
spring:
profiles: dev
application:
name: springcloud-config-dev
---
spring:
profiles: test
application:
name: springcloud-config-test
```
* 将文件提交到本地并推送到远端
# 3. Config:服务端连接Git配置
* 新建module:**springcloud-config-server-3344**
* 添加pom.xml依赖
```xml
<dependencies>
<!--Config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--web依赖-->
<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>
```
* 创建application.yml
```yml
server:
port: 3344
spring:
application:
name: springcloud-config-server
# 连接远程仓库
cloud:
config:
server:
git:
# https, 不是git
uri: 远端git仓库地址
```
* 创建主启动类**Config_Server_3344**
```java
@SpringBootApplication
@EnableConfigServer
public class Config_Server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_Server_3344.class,args);
}
}
```
* 启动3344端口服务
* 访问:http://localhost:3344/application-dev.yml
* 得到以下数据
```yml
spring:
application:
name: springcloud-config-dev
profiles:
active: dev
```
SpringCloud(五)Zuul网关与Config配置