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,配置成功,其他的服务也和这里一样配置