网关zuul是cloud的核心组件之一,感觉和nginx类似,具有反向代理和负载等功能,这里要说一下反向代理和负载均衡。
实现负载首先要实现服务注册功能,zuul做为微服务客户端首先和其他客户端一样注册到eureka server中。
下面是我的服务结构,在注册中心可以看到
其中,ZUUL是网关层,CLIENT-A,CLIENT-B做为测试客户端,一共四个应用(包括注册中心)
代码结构如下
demo1是注册中心,2,3为客户端,zuuls是路由转发zuul服务。
打开demo1 pom.xml
添加了
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
做为服务中心的相关jar
打开demo2,3(客户端) pom.xml
添加了
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
做为服务客户端的jar
打开zuuls pom.xml
除了服务客户端的jar之外,还有zuul的相关jar
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
看网上有一些其他artifactId,目前新版的需要用netflix包装的服务,原来那些用了会报错,这些更新其实挺烦人的,个人感觉是个缺点,老版的spring和新版spring各种不一致。
jar包引完之后设置一下启动类注解
demo1(注册中心),添加注解
@EnableEurekaServer
demo2,demo3(客户端),启动类添加注解
@EnableEurekaClient
同时,在demo2,demo3分别创建一个接口,为了负载均衡测试用。
demo2中
@RequestMapping("/hello")
public String hello() {
logger.info("*********" + 001);
return "hello,this is client-client001";
}
demo3中
@RequestMapping("/hello")
public String hello() {
logger.info("*********" + 002);
return "hello,client-client002";
}
zuuls启动类添加注解(既是客户端也是网关层)
@EnableZuulProxy
@EnableEurekaClient
打开demo1(服务中心)application.properties
添加如下配置
server.port=8080
spring.application.name=eu-server #server的id
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
#由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
#registerWithEureka: false
#由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
#fetchRegistry: false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
打开demo2(客户端)application.properties
server.port=9090
#设置服务名
spring.application.name=client-A
#设置服务注册中心的URL,本服务要向该服务注册中心注册自己
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
打开demo3(客户端)application.properties,和2类似
server.port=9091
#设置服务名
spring.application.name=client-B
#设置服务注册中心的URL,本服务要向该服务注册中心注册自己
eureka.client.serviceUrl.defaultZone= http://localhost:8080/eureka
唯一区别是spring.application.name的值,这个在路由映射路径的时候会用到,注册中心显示的名称也是这个值
打开zuuls(路由)application.properties
zuul转发有两种方式,一种是url,另一种是serviceid的映射,这里是第二种方式,图下中表示/api-a/ 路径可以访问到id为client-A(demo2)下的方法,/api-b/ 路径可以访问到id为client-B(demo3)下的方法,
server.port=7070
#设置服务名
spring.application.name=zuul
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=client-A
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=client-B
#设置服务注册中心的URL,本服务要向该服务注册中心注册自己
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
启动4个项目
访问网关层地址+映射
打开路径
http://localhost:7070/api-a/hello
结果如图所示:
打开http://localhost:7070/api-b/hello
结果如图所示:
那么如何负载呢,只要把客户端(demo2,3)的serviceId改成一样的就可以了
比如把demo3的spring.application.name值改成client-A
重启demo3,继续访问 http://localhost:7070/api-a/hello
第一次访问到了demo2
刷新页面,访问到了demo3
就这样,一个简单的反向代理和负载就实现了,关于负载,这里是轮询的方式,其他方式没有讲到。