1-Zuul和Eureka简单实现http代理
20181025
Zuul:请求转发(可以转发到外部接口和本地接口)、负载均衡
Eureka:服务的注册与发现
参考了:
https://www.cnblogs.com/hellxz/p/9282756.html
https://www.cnblogs.com/duanxz/p/7527765.html
主要参考了这两篇文章,文章中有些许错误,下面是我的总结。
github地址:
https://github.com/gyb123456/-zuul-eureka-demo
代码里全是我的心血,是踩过很多坑才完成的,甚至在zuul的github上提问过
前言
Zuul可以做请求转发、负载均衡,这个好理解,那么Eureka的服务的注册与发现到底什么意思,光听名字,估计没人知道啥意思,一脸懵逼好嘛,所以说英文翻译过来是很坑爹的事情。我也是看了好多文章还不理解,最后直接看了代码案例才懂啥意思,怎么实现等等,别急,我会慢慢说的(迫不及待ing.jpg...)
版本(最新版):
springboot: 2.0.6
springcloud: Finchley.SR2
它好像支持的最低就是springboot 2.0.0了,springboot最好是2.0.3以上
这个版本对应的zuul、eureka等包也改了,比如spring-cloud-starter-zuul变成了spring-cloud-starter-netflix-zuul,自己用idea新建项目时,勾选zuul的时候会自动帮你搞好的
正文
实现功能:
里面包含三个基本的service,实现了基本的转发url的功能
1 修改url后缀,将http://localhost:8080/test/aaa转发到了http://localhost:8090/test/aaa
2 修改url前缀(ip+port),将http://localhost:8080/test/aaa转发到了http://localhost:1111/test/aaa
需继承ZuulFilter重新run方法 ctx.setRouteHost(new URL("http://localhost:1111"));
下面是原理图
图片.png从图片可以看出要用Zuul+Eureka首先得开启三个服务:
zuul服务:
作为项目的入口服务器,配置拦截所需拦截的url,可以转发到不同的service,可以是本地的,也可以是其他ip.
如何配置?
application.yml
server:
port: 8080
zuul:
# 为全局指定放行Cookie和Headers信息,也可以在每个路由里设置
sensitiveHeaders: Cookie,Set-Cookie,Authorization
# ribbon配置
# ribbon:
# eager-load:
# enabled: true
# 忽略转发的url
# ignored-patterns: /**/hello/**
routes:
my-test:
path: /test/*
url: http://localhost:8090
stripPrefix: false
# 利用eureka的注册发现
my-eureka:
path: /eureka/**
service-id: my-eureka
#设置转发时不忽略path的前缀.把path的所有内容当转发路由,很有用!!!
stripPrefix: false
# 配置eureka的服务器的地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
pom(详见github)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- Eureka的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Eureka服务:
我们的真正的业务逻辑service都需要在这个服务器上注册下地址,上面的Zuul才能够给据地址自动找到我们的真正的业务逻辑service并调用,所以说Eureka相当于中转的作用,配置好以后就可以访问http://localhost:1111/查看平台了,标红的就是我的zuul服务和普通的service服务连进来的
application.properties
server.port=1111
#在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka
pom(详见github),注意这里是eureka服务端,所以肯定是eureka-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
真正的业务逻辑service:
这就是我们平时开发的普通项目,但是需要配置下,告诉Eureka服务器我这个服务的名字,以便别人调用
,怎么配置呢?
application.properties
server.port=8090
#提供到注册中心的本服务的名字
spring.application.name=my-eureka
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
最后
我也是第一次用springcloud的微服务框架 这三个项目是由启动顺序的(说明项目大做了呀)
用的时候吧service-demo对应的filter里的Component注解注释去掉即可,把其他的filter注释掉,不然相互影响的
1 先启动Eureka服务,不然其他服务先启动的话,会去注册中心找服务
2 再启动service业务服务
3 启动zuul转发器服务