zuul yml没有生效_学习笔记34-Zuul&Config

7f4b04087e551408c3e1c8ee054cc018.png

入门案例:创建Zuul项目,添加springboot-web启动器依赖,以及eureka-client的依赖,添加Zuul的依赖,还有springcloud

039b67078db2d3997ab9a0e8926adcdf.png

在配置文件中修改端口号和服务名称,指定eureka注册中心的地址,在启动类上添加Zuul代理的注解@EnableZuulProxy,启动服务。

启动之前的一个服务,不使用代理的情况下直接访问:

d5bb15930ef062b72975d4068f658b99.png

使用Zuul进行网关代理:网关服务的地址+要代理的服务名称+访问URI

3b0e2514cc55063db616ebee1187ce9f.png

Zuul的配置路由规则:url、serviceId

5bd819c45fc3f3e49c91de242d2ebe64.png

通过查看源码可以看到一些属性的默认值,对一些属性进行配置。

配置网关过滤器:在Zuul项目中新建一个类,放在启动类的子包中

测试:

package com.tangfen.filter;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

@Component
public class ZuulFilter extends com.netflix.zuul.ZuulFilter{

	public static final Logger logger = LoggerFactory.getLogger(ZuulFilter.class);
	
	/**
	 * 过滤内容
	 */
	@Override
	public Object run() throws ZuulException {
		RequestContext requestContext = RequestContext.getCurrentContext();
		HttpServletRequest request = requestContext.getRequest();
		logger.info("filter--->method={},url={}", request.getMethod(),request.getRequestURL().toString());
		return null;
	}

	/**
	 * 是否开启过滤器,默认不开启
	 */
	@Override
	public boolean shouldFilter() {
		return true;
	}

	/**
	 * 过滤顺序
	 */
	@Override
	public int filterOrder() {
		return 0;
	}

	/**
	 * 过滤类型
	 */
	@Override
	public String filterType() {
		return "pre";
	}

	
}

启动测试:

8b45bf4503555bb4e46b9fa2bb709f36.png

过滤器类型:

7c40afebc6158df00b8c64d863bfd265.png

Zuul请求的生命周期:

c8a0c47e9c141e244e8e6cc061a6cd92.png

模拟权限验证:拷贝上一个项目,修改服务名和项目名,

在过滤器中加入模拟验证的方法

d34b9dd4afd6049c6912f0d219936cf1.png

启动访问,token为空:

b36fc10ce0dbf75fa75c37227a7c25f5.png

token不为空:

44c39d21cdae906cd3e006b0ac93675d.png

9cd70c6e11946fcfcb9eb3d89a470a38.png

filter的执行顺序:值越小,执行越早

复制一份过滤器的类

9fc076f4afd060570d8b96776566e9bb.png

将过滤顺序的返回值修改为1,在过滤内容中输出一句话

启动测试:

d213df3ff19a32f80d41be9fd0491641.png

过滤器的执行顺序需要指定为同类型,即过滤类型为同一类型才可指定执行顺序

49e47f88acdb929489ae1afa7fecdb87.png

异常处理:当发生异常时走error,新建post和error的过滤器以及异常处理的类

5564ba96b951b447fc0e14f47ad15a76.png

将过滤器的过滤类型分别修改为post和error,修改后执行的pre过滤器,手动抛出一个异常

f2ceae64263f9f9e5e6562aa5f3e404a.png

启动测试:

0f382c33a878858520a1e8dfc1cd68d8.png

5702e36745ab55df2dc38b64742bbe9c.png

d00652b11e6e093c685de2d027776679.png

Zuul和Hystrix结合,Zuul中依赖了Hystrix,所以直接使用就行

使用zuul访问provider,然后使用dashboard监控zuul

c3e2dea2a7ee2eee10679623de9da294.png

服务降级:

package com.tangfen;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

/**
 * 对 Provider-Product 服务降级处理
 * 
 * @author Administrator
 *
 */
@Component
public class ProductProviderFallback implements FallbackProvider {
	/**
	 * 当服务无法执行时,该方法返回托底信息
	 */
	
	@Override
	public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
		return new ClientHttpResponse() {
			/**
			 * 设置响应的头信息
			 */
			@Override
			public HttpHeaders getHeaders() {
				HttpHeaders header = new HttpHeaders();
				MediaType mt = new MediaType("application", "json", Charset.forName("utf-8"));
				header.setContentType(mt);
				return header;
			}

			/**
			 * 设置响应体
			 */
			@Override
			public InputStream getBody() throws IOException {
				String content = "商品服务不可用,请与管理员联系";
				return new ByteArrayInputStream(content.getBytes());
			}

			/**
			 * ClientHttpResponse 的 fallback 的状态码 返回 String
			 */
			@Override
			public String getStatusText() throws IOException {
				return this.getStatusCode().getReasonPhrase();
			}

			/**
			 * ClientHttpResponse 的 fallback 的状态码 返回 HttpStatus
			 */
			@Override
			public HttpStatus getStatusCode() throws IOException {
				return HttpStatus.OK;
			}

			/**
			 * ClientHttpResponse 的 fallback 的状态码 返回 int
			 */
			@Override
			public int getRawStatusCode() throws IOException {
				return this.getStatusCode().value();
			}

			@Override
			public void close() {
				// TODO Auto-generated method stub
			}
		};
	}

	/**
	 * 给定对哪个服务做降级处理
	 */
	@Override
	public String getRoute() {
		return "ebook-product-provider";
	}


}

Zuul服务限流:添加依赖:

b9d31c86c42aa32dc7221a1b5414ea5a.png
##全局配置限流
#zuul.ratelimit.enabled=true
###60s 内请求超过 3 次,服务端就抛出异常,60s 后可以恢复正常请求
#zuul.ratelimit.default-policy.limit=3
#zuul.ratelimit.default-policy.refresh-interval=60
###针对 IP 进行限流,不影响其他 IP
#zuul.ratelimit.default-policy.type=origin

局部限流和全局限流配置基本类似,不过在default-policy后加入要限流的服务名称即可。

网关限流参数

c24ade466f9e32983fa2bb91b37d81b2.png

Zuul性能调优:设置Hystrix和ribbon的超时时间

50f665a500ec6e6c390fd7148ce29259.png

配置文件

996b252292d706ee731890440e404a70.png

Spring Cloud Config:

9c67ba3633999de2db8741ee211f3255.png

a5483095304357375d1947eab54bc2d7.png

84b1e20a7a3ee2f156abe67e3528f06a.png

创建配置中心服务端:新建项目,添加config-server的坐标

a2e91f17d9ad1317acaaceb9afbf0476.png

修改启动类,

649a19940abca9565290d5fa935252e8.png

在配置文件中添加Git的url

f2347610ab52ac3e334966286bce444a.png

新建配置文件,上传到Git中,通过url访问配置文件

在Git中新建仓库:

442ee978c44e01c86129880a084bf339.png

配置文件的命名规则与访问:

3e00def81c9efc720cd1a10e6c3ddf31.png

新建客户端,添加依赖

36b98d6af055362adb85d88b5c6697a2.png

修改启动类

bba62a491d888bfe0a913eee221a0d62.png

修改配置文件,和server关联起来:

首先把名称修改为bootstrap.yml或者bootstrap.properties

52a1dad799d7301b193b741f185e89b4.png

配置中心原理图:

e76be2b6567bc12b8b9714778b794375.png

在Git仓库中修改配置如何让服务不重启生效:配置发生修改时,当有服务访问config-server时会同步到server端的本地仓库中,但是client不重启的话并不会重新读取到最新的配置。

1、在client端加Actuator依赖,用来refresh项目,

954ea9f0379d3da4fc05b93442e4d662.png

2、开启刷新,默认为true

d87c80966c3ccfcf81cce5cb937eb259.png

3、刷新时使用的是post方式,而且由于spring创建对象使用的是单例模式,所以需要重新创建一个对象,这就需要用到@RefreshScope注解,这个注解的作用是刷新作用域。

4、发送post请求时使用httpclient工具类,修改发送请求的地址即可,当client和server都在运行时,修改了远程仓库的配置文件,只需要使用该工具类发送post请求即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值