SpringCloud学习四(Zuul路由网关、Spring Cloud Config分布式配置:Git环境搭建、服务端连接Git配置、客户端连接服务端访问远程、远程实战测试)

一、Zull路由网关

概述

什么是zuul?

Zull包含了对请求的路由(用来跳转的)和过滤两个最主要功能:

其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

比如一开始5个微服务没有zuul路由网关的时候,5个请求访问的地址都不一样,这时候我们让它访问的时候经过一个统一的路由,用这个路由去管理其中的微服务。当然要先将zuul路由注册到Eureka服务治理下。
在这里插入图片描述

注意:Zuul 服务最终还是会注册进 Eureka
提供:代理 + 路由 + 过滤 三大功能!

问题:

不同的微服务有不同的网络地址,而外部的客户端可能要调用多个服务的接口才能完成一个业务需求。比如一个电影购票可能调用用户微服务,电影微服务等,如果客户端直接和微服务通信,会存在如下常见问题:

  • 客户端多次请求不同微服务,增加客户端的复杂性
  • 跨域问题,一定场景下处理相对复杂
  • 认证复杂,每个服务都要独立认证
  • 难重构,随着项目迭代,可能需重新划分微服务,重构难以实施
  • 某些微服务可能使用了其他协议,直接访问会有问题

以上问题可以借助微服务网关API Gateway来解决,微服务网关介于客户端和服务器端之间,所有的外部请求都会先经过微服务网关:

Zuul作用:

  • 提供统一服务入口,微服务对前台透明
  • 聚合后台服务,节省流量,提升性能
  • 安全,过滤,流控等API管理功能
  • 提供统一服务出口,解耦

官方文档:https://github.com/Netflix/zuul/

入门案例

新建springcloud-zuul模块,并导入依赖
把dashboard的依赖拿过来 加个zuul的依赖

<dependencies>
    <!--导入zuul依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zuul</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>
    <!--dashboard依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboar</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>
    <!--实体类+web-->
    <dependency>
        <groupId>com.haust</groupId>
        <artifactId>springcloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </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>

application.yml

server:
  port: 9527
spring:
  application:
    name: springcloud-zuul #微服务名称
# eureka 注册中心配置
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance: #实例的id
    instance-id: zuul9527.com
    prefer-ip-address: true # 显示ip
info:
  app.name: haust.springcloud # 项目名称
  company.name: 河南科技大学西苑校区 # 公司名称
# zull 路由网关配置
zuul:
  # 路由相关配置
  # 原来访问路由 eg:http://www.cspStudy.com:9527/springcloud-provider-dept/dept/get/1
  # zull路由配置后访问路由 eg:http://www.cspstudy.com:9527/haust/mydept/dept/get/1
  routes:
    mydept.serviceId: springcloud-provider-dept # eureka注册中心的服务提供方路由名称
    mydept.path: /mydept/** # 将eureka注册中心的服务提供方路由名称 改为自定义路由名称
  # 不能再使用这个路径访问了,*: 忽略,隐藏全部的服务名称~
  ignored-services: "*"
  # 设置公共的前缀
  prefix: /haust

主启动类

/**
 * @Description: Zull路由网关主启动类
 */
@SpringBootApplication
@EnableZuulProxy // 开启Zuul
public class ZuulApplication_9527 {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication_9527.class,args);
    }
}

再增加一个域名
在这里插入图片描述

测试:
在这里插入图片描述
可以看出Zull路由网关被注册到Eureka注册中心中了!
在这里插入图片描述
上图是没有经过Zuul路由网关配置时,服务接口访问的路由,可以看出直接用微服务(服务提供方)名称去访问,这样不安全,不能将微服务名称暴露!

所以经过Zull路由网关配置后,访问的路由为:
在这里插入图片描述
我们看到,微服务名称被替换并隐藏,换成了我们自定义的微服务名称mydept,同时加上了前缀haust,这样就做到了对路由访问的加密处理!

详情参考springcloud中文社区zuul组件 :https://www.springcloud.cc/spring-cloud-greenwich.html#_router_and_filter_zuul

Zuul高可用

通过将多个zuul节点注册到Eureka Server实现高可用。存在以下两种情况:

  • Zuul客户端注册到了Eureka Server
    Zuul客户端自动从Eureka Server查询Zuul Server列表,并用Ribbon负载均衡请求Zuul集群。
    在这里插入图片描述

  • 未注册到Eureka Server
    微服务可能被其他微服务调用,也可能直接被终端app调用,这种情况,我们需要借助额外的负载均衡器来实现Zuul的高可用,比如Nginx等。
    在这里插入图片描述

Zuul聚合微服务

场景:许多场景下,一个外部请求,可能要查询后端多个微服务。比如一个电影售票系统,在购票订单页上,需要查电影微服务,还有用户微服务,如果让系统直接请求各个微服务,就算使用Zuul转发,网络开销、流量耗费、时长都不是很好,这时我们就可以使用Zuul聚合微服务请求,即应用系统值发送一个请求给Zuul,由Zuul请求用户微服务和电影微服务,并组织好数据返给应用系统。

使用这种方式,用户只须发送一次请求即可,简化了客户端侧的开发

二、 Spring Cloud Config 分布式配置

安装git,注册github和码云账号。国内用码云速度会快些
服务得放在远程,Java去读远程配置

概述

分布式系统面临的–配置文件问题

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。spring cloud提供了configServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百个的配置文件修改起来,令人头疼!

什么是SpringCloud config分布式配置中心?

可以写多个客户端client去连接服务器server,然后把配置统一的放在github或者码云上,通过server去链接github,有问题在github联调就好了。
实现了配置和编码解耦
在这里插入图片描述

一个配置中心提供的核心功能

  • 提供服务端和客户端支持
  • 集中管理各环境的配置文件
  • 配置文件修改之后,可以快速的生效(不用重启)
  • 可以进行版本管理
  • 支持大的并发查询
  • 支持各种语言

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,

  • server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,
  • client通过接口获取数据、并依据此数据初始化自己的应用。

Spring cloud使用git或svn存放配置文件,默认情况下使用git。

spring cloud config 分布式配置中心能干嘛?

  • 集中式管理配置文件
  • 不同环境,不同配置,动态化的配置更新,分环境部署,比如 /dev /test /prod /beta /release
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置
  • 将配置信息以REST接口的形式暴露

spring cloud config 分布式配置中心与GitHub整合

由于spring cloud config 默认使用git来存储配置文件 (也有其他方式,比如自持SVN 和本地文件),但是最推荐的还是git ,而且使用的是 http / https 访问的形式。

如果想详细了解这个开发和运维的整个项目流程的可以看以下链接:
DevOps入门理解(DevOps是什么、瀑布模型、敏捷开发、DevOps、DevOps与虚拟化、容器、微服务)

idea的github可以直接连接远程的,如果是用git的话我们需要配置自己的git工具
在这里插入图片描述

git+码云环境搭建

入门案例
码云创建仓库
在这里插入图片描述
创建好后
在这里插入图片描述
创建好后要把这个仓库下载到本地
在这里插入图片描述
正常情况下,我们用git客户端下载,复制这个ssh链接
在这里插入图片描述
git clone
在这里插入图片描述
在这里插入图片描述
这个时候显示权限不够
在这里插入图片描述
设置提交代码时的用户信息
在这里插入图片描述
在这里插入图片描述
然后再用list查询配置
再测试发现要生成密钥
删除这个文件
在这里插入图片描述
在这里插入图片描述
生成密钥命令 email填自己的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
复制公钥
在这里插入图片描述
在这里插入图片描述
添加完之后再去下载,连接码云输入yes
在这里插入图片描述
总结:下载git,创建码云账号,创建仓库,生成密钥,clone仓库
在这里插入图片描述

将本地git仓库springcloud-config文件夹下新建的application.yml提交到码云仓库:

在这里插入图片描述
在这里插入图片描述
这个时候只是提交到本地并没有到远程
在这里插入图片描述
在这里插入图片描述
定位资源的默认策略是克隆一个git仓库(在spring.cloud.config.server.git.uri),并使用它来初始化一个迷你SpringApplication。小应用程序的Environment用于枚举属性源并通过JSON端点发布。

在这里插入图片描述

其中“应用程序”作为SpringApplication中的spring.config.name注入(即常规的Spring Boot应用程序中通常是“应用程序”),“配置文件”是活动配置文件(或逗号分隔列表的属性),“label”是可选的git标签(默认为“master”)。

服务端

新建springcloud-config-server-3344模块导入pom.xml依赖
maven仓库找一个config-server

<dependencies>
    <!--web-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--config-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <!--eureka-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
</dependencies>

resource下创建application.yml配置文件,Spring Cloud Config服务器从git存储库(必须提供)为远程客户端提供配置:
在这里插入图片描述
看官方文档,可以连git也可以连svn
连接用https
在这里插入图片描述

server:
  port: 3344
spring:
  application:
    name: springcloud-config-server
  # 连接码云远程仓库
  cloud:
    config:
      server:
        git:
          # 注意是https的而不是ssh
          uri: https://gitee.com/cao_shi_peng/springcloud-config.git 
            # 通过 config-server可以连接到git,访问其中的资源以及配置~
# 不加这个配置会报Cannot execute request on any known server 这个错:连接Eureka服务端地址不对
# 或者直接注释掉eureka依赖 这里暂时用不到eureka
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

主启动类

@EnableConfigServer // 开启spring cloud config server服务
@SpringBootApplication
public class Config_server_3344 {
    public static void main(String[] args) {
        SpringApplication.run(Config_server_3344.class,args);
    }
}

测试访问http://localhost:3344/application-dev.yml
在这里插入图片描述
HTTP服务具有以下格式的资源:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{ profile}.properties

测试访问 http://localhost:3344/application/test/master
在这里插入图片描述
测试访问 http://localhost:3344/master/application-dev.yml
在这里插入图片描述
如果测试访问不存在的配置则不显示 如:http://localhost:3344/master/application-aaa.yml
因为这个aaa在我们刚刚编写的yml文件中不存在

在这里插入图片描述

总结:通过config-server。可以连接到git,访问其中的资源以及配置

客户端

将本地git仓库springcloud-config文件夹下新建的config-client.yml提交到码云仓库:
在这里插入图片描述

在这里插入图片描述
新建一个springcloud-config-client-3344模块,并导入依赖

<!--config-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-start -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

resources下创建application.yml和bootstrap.yml配置文件

bootstrap.yml 是系统级别的配置优先级更高
uri: http://localhost:3344 去连接config服务器

# 系统级别的配置
spring:
  cloud:
    config:
      name: config-client # 需要从git上读取的资源名称,不要后缀
      profile: dev
      label: master
      uri: http://localhost:3344 

application.yml 是用户级别的配置

# 用户级别的配置
spring:
  application:
    name: springcloud-config-client

创建controller包下的ConfigClientController.java 用于测试

@RestController
public class ConfigClientController {
    @Value("${spring.application.name}")
    private String applicationName; //获取微服务名称
    @Value("${eureka.client.service-url.defaultZone}")
    private String eurekaServer; //获取Eureka服务
    @Value("${server.port}")
    private String port; //获取服务端的端口号
    @RequestMapping("/config")
    public String getConfig(){
        return "applicationName:"+applicationName +
         "eurekaServer:"+eurekaServer +
         "port:"+port;
    }
}

主启动类

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

测试:

启动服务端Config_server_3344 再启动客户端ConfigClient

访问:http://localhost:8201/config/
在这里插入图片描述
小案例

实战测试eureka和provider远程配置

本地新建config-dept.yml和config-eureka.yml并提交到码云仓库

把之前的eureka7001的yml文件复制两份方案。
加入spring.profiles.active
然后加入spring.profiles等配置改一下名字
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

config-eureka也是复制provider-dept的yml复制两份 然后设置一下spring.profiles 模拟一下环境
mybatis的db可以换一个比如db02

在这里插入图片描述

这里配置文件内容不再列举直接到代码中看把。

测试Eureka配置

新建springcloud-config-eureka-7001模块,并将原来的springcloud-eureka-7001模块下的内容拷贝的该模块。

1.清空该模块的application.yml配置,并新建bootstrap.yml连接远程配置

spring:
  cloud:
    config:
      name: config-eureka # 仓库中的配置文件名称
      label: master
      profile: dev
      uri: http://localhost:3344

2.在pom.xml中添加spring cloud config依赖

<!--config-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

3.主启动类

@SpringBootApplication
@EnableEurekaServer //EnableEurekaServer 服务端的启动类,可以接受别人注册进来~
public class ConfigEurekaServer_7001 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigEurekaServer_7001.class,args);
    }
}

4.测试

第一步:启动 Config_Server_3344,并访问 http://localhost:3344/master/config-eureka-dev.yml 测试
在这里插入图片描述

第二步:启动ConfigEurekaServer_7001,访问 http://localhost:7001/ 测试

在这里插入图片描述
显示上图则成功

新建一个8001端口测试配置

新建springcloud-config-dept-8001模块并拷贝springcloud-provider-dept-8001的内容

同理导入spring cloud config依赖、清空application.yml 、新建bootstrap.yml配置文件并配置

spring:
  cloud:
    config:
      name: config-dept
      label: master
      profile: dev
      uri: http://localhost:3344

主启动类

@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到Eureka中!
@EnableDiscoveryClient //服务发现~
@EnableCircuitBreaker //
public class ConfigDeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigDeptProvider_8001.class,args);
    }
    //增加一个 Servlet
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        return registrationBean;
    }
}

测试 (略)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无极的移动代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值