一 概要
之前搭了注册中心+1消费者+2生产者+1分布式事务
【例子】springcloud微服务搭建(一)注册中心+生产者+消费者+feign+负载均衡+熔断器
feign分布式事务
这次加上网关zuul。
概念:正向代理,即vpn这种,客户需要提交代理服务器和目标的地址,由代理去访问返回;反向代理,如nginx,客户只需要正常访问网站,发送一个目标地址,代理服务器会拦截请求、转发给内网、返回结果。有一说一,你们人类就是喜欢起这么些个奇葩名字,听着高端?
我的理解zuul有反向代理的意思,它作为springcloud的微服务之一存在,负责接收请求,根据注册中心的列表映射为其它微服务地址,并最终返回结果。其实和feign有点相似,不过feign为微服务服务,协助微服务调用接口做负载均衡,而zuul为外部请求做调用和负载均衡。
zuul前面还能前置nginx,nginx为了高可用还能前置东西,禁止禁止套娃
二 搭建zuul
1 idea建立sc的module,选取zuul、eureka、hystrix,手动添加retry
4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE com.zuul zuulgate 0.0.1-SNAPSHOT zuulgate Demo project for Spring Boot
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--导入重试机制的坐标-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
因为除去zuul自身的依赖,还需要注册、拉取注册中心的列表、调用微服务时提供熔断重试机制。
2 入口类增加注解
@EnableZuulProxy,此注解为增强版EnableZuulServer,并包含EurekaClient注解,因此只需要写这一条。 3 配置
server.port=8769 spring.application.name=ZUUL-SERVICE #请求路径前缀,会一并被映射 #zuul.prefix=/v1 #请求路径 zuul.routes.s1.path=/ccc/** #映射为指定地址 #zuul.routes.s1.url=http://xxx zuul.routes.s1.service-id=RIBBON-CUS zuul.routes.s2.path=/ppp/** zuul.routes.s2.service-id=SERVICE-HI #重试 zuul.retryable=true #连接时间,使用默认 #zuul.host.max-per-route-connections= #zuul.host.socket-timeout-millis= #zuul.host.connect-timeout-millis= #不代理的服务器 #zuul.ignored-services= #获取注册列表的周期 eureka.client.registry-fetch-interval-seconds=5 eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ #返回ip,而不是hostname eureka.instance.prefer-ip-address=true #本机ip eureka.instance.ip-address=127.0.0.1 #超时时间 毫秒 ribbon.ConnectTimeout=250 ribbon.ReadTimeout=2000 #是否对所有操作都重试 ribbon.okTpRetryOnAllOperations=true #统一服务不同实例重试次数 ribbon.MaxAutoRetriesNextServer=2 #统一实例重试次数 ribbon.MaxAutoRetrues=2 #6秒后熔断 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000 4 启动,测试。
这里将/ccc/映射到之前的调用者cus,/ppp/映射到生产者SERVICE-HI(两个product)。
可发现:
两个生产者的服务名都为SERVICE-HI,网关zuul配置ppp映射到SERVICE-HI。多次访问网关http://127.0.0.1:8769/ppp/xx?name=xxx&time=0(接口自行定义,需要一致),可发现网关做了负载均衡,两个生产者都有被调用。