SpringCloud學習筆記-zuul網關


         公司目前使用的是dubbo方式實現微服務,想試水改造接口層服務為Spring Cloud, 以下是網絡拓補圖。

        第一層負載均衡可以用nginx或者zuul(即有2層zuul), 本圖畫的是nginx。


        Zuul的作用就是路由轉發和過濾, 即將請求轉發到微服務或攔截請求; Zuul默認集成了負載均衡功能。

      下面創建一個zuul工程:

      打開IntelliJ Idea ---> New Project ---> 選擇Spring Initializr ---> 設置包名 ---> 勾選web、zuul、Eureka Discovery -> 設置存儲路徑。


一、 路由:

       在入口類添加注解@EnableZuulProxy, 即打開zuul功能;


   
   
  
  
          
  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableZuulProxy
  4. public class SpringZuulDemoApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(SpringZuulDemoApplication.class, args);
  7. }
  8. }

       修改配置文件, 指定注冊中心地址和路由規則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函數。


   
   
  
  
          
  1. @RestController(value = "/servicehello1")
  2. public class ZuulTestController {
  3. @Value("${server.port}")
  4. String port; //在application.yml文件里賦的值
  5. @RequestMapping("helloworld")
  6. public String doHello(@RequestParam String param) {
  7. return "servicehello1! " + param + ":" + "port is " + port;
  8. }
  9. }

二、過濾,  zuul可以實現驗簽功能和自定義過濾功能, 功能跟SpringMVC的攔截器一樣。

       在zuuldemo工程里新建一個Java類, PS:可以定義多個過濾類,設置不同的filterOrder(即執行時序), 基類都是ZuulFilter;

        下面定義2個攔截器類, filterOrder值為0和1。


   
   
  
  
          
  1. public class DemoFilter extends ZuulFilter {
  2. private static Logger logger = LoggerFactory.getLogger(DemoFilter.class);
  3. @Override
  4. public String filterType() {
  5. return "pre"; //枚舉值:pre, routing, post, error
  6. }
  7. @Override
  8. public int filterOrder() {
  9. return 1; //優先級, 0是最高優先級即最先執行
  10. }
  11. @Override
  12. public boolean shouldFilter() {
  13. return true; //寫邏輯,是否需要執行過濾。true會執行run函數,false不執行run函數
  14. }
  15. @Override
  16. public Object run() {
  17. logger.info("----------------this is DemoFilter----------");
  18. RequestContext ctx = RequestContext.getCurrentContext();
  19. HttpServletRequest request = ctx.getRequest();
  20. logger.info(String.format("%s %s", request.getMethod(), request.getRequestURL().toString()));
  21. Object accessToken = request.getParameter("token");
  22. if(accessToken == null) { //判斷釋放有token自動
  23. logger.warn("token is empty");
  24. ctx.setSendZuulResponse(false);
  25. ctx.setResponseStatusCode(401);
  26. try {
  27. ctx.getResponse().getWriter().write("token is empty");
  28. }catch (Exception e){}
  29. return null;
  30. }
  31. return null;
  32. }
  33. }


   
   
  
  
          
  1. @Component
  2. public class Demo1Filter extends ZuulFilter{
  3. private static Logger logger = LoggerFactory.getLogger(DemoFilter.class);
  4. @Override
  5. public String filterType() {
  6. return "pre"; //枚舉值:pre, routing, post, error
  7. }
  8. @Override
  9. public int filterOrder() {
  10. return 0; //優先級, 0是最高優先級即最先執行
  11. }
  12. @Override
  13. public boolean shouldFilter() {
  14. return true; //寫邏輯,是否需要執行過濾。true會執行run函數,false不執行run函數
  15. }
  16. @Override
  17. public Object run() {
  18. logger.info("----------------this is Demo1Filter----------");
  19. return null;
  20. }
  21. }

filterType:表示過濾類型。 pre表示路由之前, routing表示路由當中, post表示路由之后, error表示路由發生錯誤。

filterOrder: 執行時序, 值是0,1,2....N等自然數。 0的優先級最高,即最先執行。

shouldFilter: 是否需要執行run函數。

run:攔截器的具體實現;

      在瀏覽器輸入: localhost:13000/servicehello1/hello?param="test"會顯示攔截器的返回值, 即請求被成功攔截。


   
   
  
  
          
  1. 2017-11-28 13:04:07.837 INFO 28824 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
  2. 2017-11-28 13:05:31.720 INFO 28824 --- [io-13000-exec-3] com.example.springzuuldemo.DemoFilter : ----------------this is Demo1Filter----------
  3. 2017-11-28 13:05:31.720 INFO 28824 --- [io-13000-exec-3] com.example.springzuuldemo.DemoFilter : ----------------this is DemoFilter----------
  4. 2017-11-28 13:05:31.720 INFO 28824 --- [io-13000-exec-3] com.example.springzuuldemo.DemoFilter : GET http://localhost:13000/servicehello1/hello
  5. 2017-11-28 13:05:31.761 INFO 28824 --- [io-13000-exec-3] s.c.a.AnnotationConfigApplicationContext : Refreshing


        

       在瀏覽器輸入: localhost:13000/servicehello1/hello?param="test"&param="123" , 即符合攔截器規則后執行了service-hello1服務的hello接口。
          

        綜上, zuul包裝了微服務, 微服務對調用者是透明的, 即調用者不知道訪問了哪個微服務。 zuul可以理解為路由器和過濾器的綜合體。


參考代碼:http://download.csdn.net/download/brycegao321/10138936



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM