公司目前使用的是dubbo方式實現微服務,想試水改造接口層服務為Spring Cloud, 以下是網絡拓補圖。
第一層負載均衡可以用nginx或者zuul(即有2層zuul), 本圖畫的是nginx。
Zuul的作用就是路由轉發和過濾, 即將請求轉發到微服務或攔截請求; Zuul默認集成了負載均衡功能。
下面創建一個zuul工程:
打開IntelliJ Idea ---> New Project ---> 選擇Spring Initializr ---> 設置包名 ---> 勾選web、zuul、Eureka Discovery -> 設置存儲路徑。
一、 路由:
在入口類添加注解@EnableZuulProxy, 即打開zuul功能;
-
@SpringBootApplication
-
@EnableEurekaClient
-
@EnableZuulProxy
-
public class SpringZuulDemoApplication {
-
-
public static void main(String[] args) {
-
SpringApplication.run(SpringZuulDemoApplication.class, args);
-
}
-
}
修改配置文件, 指定注冊中心地址和路由規則zuul.routes, 建議使用微服務名稱命名子節點。
啟動Eureka注冊中心、service-hello1、service-ribbon-consumer1和當前服務。
在瀏覽器輸入:http://localhost:13000/servicehello1/hello?param=“test”
以/servicehello1/開頭的請求會被轉發到service-hello1服務, 以/consumer1/開頭的請求會被轉發到service-ribbon-consumer1服務。 PS: 如果是集群服務, 那么會轉發到不同的ip/port。
http://localhost:13000/servicehello1/hello?param=“test”最終會執行doHello函數。
-
@RestController(value = "/servicehello1")
-
public class ZuulTestController {
-
@Value("${server.port}")
-
String port; //在application.yml文件里賦的值
-
-
@RequestMapping("helloworld")
-
public String doHello(@RequestParam String param) {
-
return "servicehello1! " + param + ":" + "port is " + port;
-
}
-
}
二、過濾, zuul可以實現驗簽功能和自定義過濾功能, 功能跟SpringMVC的攔截器一樣。
在zuuldemo工程里新建一個Java類, PS:可以定義多個過濾類,設置不同的filterOrder(即執行時序), 基類都是ZuulFilter;
下面定義2個攔截器類, filterOrder值為0和1。
-
public class DemoFilter extends ZuulFilter {
-
private static Logger logger = LoggerFactory.getLogger(DemoFilter.class);
-
-
@Override
-
public String filterType() {
-
return "pre"; //枚舉值:pre, routing, post, error
-
}
-
-
@Override
-
public int filterOrder() {
-
return 1; //優先級, 0是最高優先級即最先執行
-
}
-
-
@Override
-
public boolean shouldFilter() {
-
return true; //寫邏輯,是否需要執行過濾。true會執行run函數,false不執行run函數
-
}
-
-
@Override
-
public Object run() {
-
logger.info("----------------this is DemoFilter----------");
-
-
RequestContext ctx = RequestContext.getCurrentContext();
-
HttpServletRequest request = ctx.getRequest();
-
logger.info(String.format("%s %s", request.getMethod(), request.getRequestURL().toString()));
-
-
Object accessToken = request.getParameter("token");
-
if(accessToken == null) { //判斷釋放有token自動
-
logger.warn("token is empty");
-
ctx.setSendZuulResponse(false);
-
ctx.setResponseStatusCode(401);
-
try {
-
ctx.getResponse().getWriter().write("token is empty");
-
}catch (Exception e){}
-
-
return null;
-
}
-
return null;
-
}
-
}
和
-
@Component
-
public class Demo1Filter extends ZuulFilter{
-
private static Logger logger = LoggerFactory.getLogger(DemoFilter.class);
-
-
@Override
-
public String filterType() {
-
return "pre"; //枚舉值:pre, routing, post, error
-
}
-
-
@Override
-
public int filterOrder() {
-
return 0; //優先級, 0是最高優先級即最先執行
-
}
-
-
@Override
-
public boolean shouldFilter() {
-
return true; //寫邏輯,是否需要執行過濾。true會執行run函數,false不執行run函數
-
}
-
-
@Override
-
public Object run() {
-
logger.info("----------------this is Demo1Filter----------");
-
return null;
-
}
-
}
filterType:表示過濾類型。 pre表示路由之前, routing表示路由當中, post表示路由之后, error表示路由發生錯誤。
filterOrder: 執行時序, 值是0,1,2....N等自然數。 0的優先級最高,即最先執行。
shouldFilter: 是否需要執行run函數。
run:攔截器的具體實現;
在瀏覽器輸入: localhost:13000/servicehello1/hello?param="test"會顯示攔截器的返回值, 即請求被成功攔截。
-
2017-11-28 13:04:07.837 INFO 28824 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
-
2017-11-28 13:05:31.720 INFO 28824 --- [io-13000-exec-3] com.example.springzuuldemo.DemoFilter : ----------------this is Demo1Filter----------
-
2017-11-28 13:05:31.720 INFO 28824 --- [io-13000-exec-3] com.example.springzuuldemo.DemoFilter : ----------------this is DemoFilter----------
-
2017-11-28 13:05:31.720 INFO 28824 --- [io-13000-exec-3] com.example.springzuuldemo.DemoFilter : GET http://localhost:13000/servicehello1/hello
-
2017-11-28 13:05:31.761 INFO 28824 --- [io-13000-exec-3] s.c.a.AnnotationConfigApplicationContext : Refreshing
在瀏覽器輸入: localhost:13000/servicehello1/hello?param="test"¶m="123" , 即符合攔截器規則后執行了service-hello1服務的hello接口。
綜上, zuul包裝了微服務, 微服務對調用者是透明的, 即調用者不知道訪問了哪個微服務。 zuul可以理解為路由器和過濾器的綜合體。
參考代碼:http://download.csdn.net/download/brycegao321/10138936