SpringCloud之Zuul和Config

1.Zuul路由网关

1.概述

什么是zuul?

  zuul包含了对请求的路由和过滤两个最主要的功能

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

注意:zuul服务最终还是会注册进eureka

提供:代理+路由+过滤三大功能

2.zuul的简单使用

创建zuul服务
1.导入依赖

<dependencies>

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

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.qf</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.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
    </dependencies>

2.配置application.yml

server:
  port: 9527

spring:
  application:
    name: zuul9527

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka

3.开启配置

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

启动注册中心,zuul和一个procider服务,访问本地服务提供的端口:localhost:8001/dept/get/1(注意两张图片的路径)
在这里插入图片描述
再访问localhost:9527/provider-dept/dept/get/4
在这里插入图片描述
在application.yml中,修改成如下配置,将真实的服务隐藏,对外提供一个虚拟的服务名

zuul:
  routes:
    mydept.serviceId: provider-dept	
    mydept.path: /mydept/**		#暴露虚拟的服务
  ignored-services: provider-dept   #隐藏真实的服务名,通过该服务名访问会报错
 # ignored-services: "*"	#隐藏所有的服务名
 

重新启动服务,localhost:9527/provider-dept/dept/get/1该路径已经失效,只能通过 http://localhost:9527/mydept/dept/get/1访问

可以在配置中添加prefix属性如:

zuul:
  routes:
    mydept.serviceId: provider-dept
    mydept.path: /mydept/**   #对外提供虚拟的服名
  ignored-services: provider-dept   #隐藏真实的服务名,对外不再提供
  #ignored-services: "*"   #隐藏所有的服务名
  prefix: /qf   #项目统一访问前缀

配置prefix之后,所有访问路径的后面必须得加上/qf,如:localhost:9527/qf/mydept/dept/get/1
在这里插入图片描述

2.SpringCloud Config分布式配置

概述

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

  微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件就有很多配置文件了。
在这里插入图片描述
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务为各个不同微服务应用的所有环境提供了中心化的外部配置。

SpringCloud Config分为服务端和客户端两部分。

服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密、解密信息等访问接口。

客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

作用:

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

SpringCloud Config分布式配置中心与GitHub整合

由于SpringCloud Config默认使用Git来存储配置文件(也有其他方式,比如SVN和本地文件),单最推荐的还是GIT,而且使用的是http/https访问的形式。

1.git环境搭建

在码云上创建一个仓库
在这里插入图片描述
然后在本地创建一个文件夹作为仓库

然后在进入仓库的目录右键git bash here ,将远程仓库拉取下来,git clone 仓库地址

进入springcloud-config仓库,创建一个application.yml

spring:
  profiles:
    active:

---
spring:
  profiles: dev
  application:
    name: springcloud-config-dev

---
spring:
  profiles: pro
  application:
    name: springcloud-config-pro

---
spring:
  profiles: test
  application:
    name: springcloud-config-test

然后右键git bash here,将该文件推送到远程仓库

git add .
git status
git commit -m "first commit"
git push
2.服务端连接git配置

创建项目,导入依赖

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

配置application.yml

server:
  port: 3344
spring:
  application:
    name: springcloud-config-server

  cloud:
    config:
       server:
         git:	#uri:仓库的地址
           uri: https://gitee.com/jing_bo_bear/SpringCloud-Config.git
           username: xxxx@qq.com	#如果仓库设置了身份验证,这里需要添加账户和密码
           password: xxxx

启动类添加注解

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

启动服务,访问: localhost:3344/application-dev.yml

修改路径成 localhost:3344/application-pro.yml会显示application.yml中对应的配置
在这里插入图片描述
HTTP服务具有以下格式的资源:

/{application}/{profile}[/{label}]		如:localhost:3344/application/dev/master
/{application}-{profile}.yml	如:localhost:3344/application-dev.yml
/{label}/{application}-{profile}.yml	如:localhost:3344/master/application-test.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

如:
在这里插入图片描述

3.客户端连接服务端访问远程

在本地仓库创建config-client.yml

spring:
  profiles:
    active: dev

---
server:
  port: 8201

spring:
  profiles: dev
  application:
    name: springcloud-provider-dept

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka/

---
server:
  port: 8202

spring:
  prifiles: test
  application:
    name: springcloud-provider-dept

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka/

将其推送到git上

git add .
git commit -m ''
git push

创建config客户端服务

//导入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>2.2.0.RELEASE</version>
    </dependency>
</dependencies>

创建bootstrap.yml配置文件

#bootstrap:系统级的配置

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

创建 controller

@RestController
public class ConfigClientController {

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${eureka.client.service-url.defaultZone}")
    private String eurekaServer;

    @Value("${server.port}")
    private String port;

    @RequestMapping("/config")
    public String getConfig(){
        return "applicationName:"+applicationName+
                "eurekaServer:"+eurekaServer+
                "port:"+port;
    }

}

启动类配置

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

分别启动config服务端和客户端

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

4.远程配置实战测试

在项目的基础将配置都交给config统一管理

1.eureka注册中心的修改

在本地仓库创建config-eureka-server.yml并将其推送到远程仓库中

spring:
  profiles:
    active: dev

---
spring:
  profiles: dev
  application:
    name: eureka7001.com
server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com
    #prefer-ip-address: true
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

---
spring:
  profiles: test
  application:
    name: eureka7001.com
server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com
    #prefer-ip-address: true
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

在eureka7001的服务中加入依赖

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

创建bootstrap.yml配置文件并把application.yml删除

spring:
  cloud:
    config:
      name: config-eureka-server   #需要从git上读取的资源的名称,不需要后缀
      label: master   #分支
      uri: http://localhost:3344
      profile: dev

启动服务并访问localhost:7001:
在这里插入图片描述
2.服务提供者provider的修改(步骤和上面eureka一样)

在本地仓库创建config-provider8001.yml并将其推送到远程仓库中

spring:
  profiles:
    active: dev

---
spring:
  profiles: dev
  application:
    name: provider-dept
  datasource:
    password: 123
    username: root
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql:///db01
server:
  port: 8001
mybatis:
  type-aliases-package: com.qf.scloudbibik.pojo
  config-location: classpath:mybatis.xml
  mapper-locations: classpath:mapper/*.xml


eureka:
  client:
    service-url:
      defaultZone: http://localhost:7002/eureka/,http://localhost:7001/eureka/,http://localhost:7003/eureka/
  instance:
    instance-id: springcloud-provider-dept8001

#info配置
info:
  app.name: kuangshen-springcloud
  company.name: blog.kuangstudy.com

---
spring:
  profiles: test
  application:
    name: provider-dept
  datasource:
    password: 123
    username: root
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql:///db01
server:
  port: 8001
mybatis:
  type-aliases-package: com.qf.scloudbibik.pojo
  config-location: classpath:mybatis.xml
  mapper-locations: classpath:mapper/*.xml


eureka:
  client:
    service-url:
      defaultZone: http://localhost:7002/eureka/,http://localhost:7001/eureka/,http://localhost:7003/eureka/
  instance:
    instance-id: springcloud-provider-dept8001

#info配置
info:
  app.name: kuangshen-springcloud
  company.name: blog.kuangstudy.com

在provider8001服务中导入依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

创建bootstrap.yml文件

spring:
  cloud:
    config:
      name: config-provider8001
      uri: http://localhost:3344
      label: master
      profile: test

启动服务刷新eureka页面,发现服务已经注册上来
在这里插入图片描述
访问localhost:8001/dept/list,配置成功,其他的服务也和这里一样配置
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值