微服務架構開發一zuul路由的限流,熔斷

話不多說,直接貼碼:

需要的jar

<!-- zuul限流 -->
        <dependency>
            <groupId>com.marcosbarbero.cloud</groupId>
            <artifactId>spring-cloud-zuul-ratelimit</artifactId>
            <version>2.0.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.0.4.RELEASE</version>
        </dependency>
    </dependencies>

配置:
zuul:
  routes:
    api-a: #id
      path: /api-a/**  #路徑
      serviceId: EURKA-CLIENT1 #子服務id
    api-b:
      path: /api-b/**
      serviceId: EURKA-CLIENT131/
      ###限流
  ratelimit:
    enabled: true #開啓限流
    repository: redis #限流內容存儲介質
    default-policy:#以下配置說明,3秒中只能有一次請求,且請求總時間不能超過1秒
      limit: 1 
      quota: 1
      refresh-interval: 3
    policies: #指定特殊子服務進行配置
      EURKA-CLIENT1: #字符id
        limit: 10
        quota: 50
        refresh-interval: 60
        type: url
     要想具體瞭解限流可以參照https://mp.csdn.net/postedit/86711784這篇文章

熔斷,是zuul自己的,項目中增加如下類,一切ok

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.json.JSONException;
import org.json.JSONObject;
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;

import com.google.gson.JsonObject;
/**
 * @author 王峯
 * @Time:2019年1月29日 下午4:14:23
 * @version 1.0
 * zuul 斷路反饋,比如路由指定的子服務沒有啓動報錯,我們可以把錯誤信息進行包裝在反饋給消費者
 * 
 * 
 */
@Component
public class ApiFallbackProvider implements  FallbackProvider{ 
    @Override
    public String getRoute() {
    return "*";//在此可以指定對應子服務的id,如果是全部用*或者null
}

@Override
public ClientHttpResponse fallbackResponse(String route, Throwable throwable) {
    return new ClientHttpResponse() {
        @Override
        public HttpStatus getStatusCode() throws IOException {
            return HttpStatus.OK;
        }

        @Override
        public int getRawStatusCode() throws IOException {
            return 200;
        }

        @Override
        public String getStatusText() throws IOException {
            return "OK";
        }

        @Override
        public void close() {

        }

        @Override
        public InputStream getBody() throws IOException {JSONObject r = new JSONObject();
        try {
            r.put("state", "9999");
            r.put("msg", "系統錯誤,請求失敗");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return new ByteArrayInputStream(r.toString().getBytes("UTF-8"));}

        @Override
        public HttpHeaders getHeaders() {
            HttpHeaders headers = new HttpHeaders();
            //和body中的內容編碼一致,否則容易亂碼
            headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
            return headers;
        }
    };
}}

至此路由這塊的完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章