<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ### OpenFeign 適配器 Sentinel 整合 OpenFeign 主要用于實現熔斷降級,因此,關于 OpenFeign 的 Sentinel 適配器的使用介紹基于服務消費端。 #### **使用步驟** **1\. 引入依賴** 借助 spring-cloud-starter-alibaba-sentinel 實現與 OpenFeign 整合,添加依賴配置如下: ~~~ <!-- 熔斷限流組件 --> <dependency> <groupId>com.open.capacity</groupId> <artifactId>sentinel-spring-boot-starter</artifactId> </dependency> <!-- 選用nacos時打開--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency> ~~~ **2. 啟用 OpenFeign 整合 Sentinel 的自動配置** 在 application.yaml 配置文件中添加如下配置,啟用 Sentinel 與 OpenFeign 整合適配器。 ~~~ feign: sentinel: enabled: true ~~~ **3. 編寫Feign** ``` package com.open.capacity.uaa.feign; import java.util.Map; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import com.open.capacity.common.auth.details.LoginAppUser; import com.open.capacity.common.feign.FeignExceptionConfig; import com.open.capacity.common.model.SysUser; import com.open.capacity.common.web.PageResult; import com.open.capacity.uaa.feign.fallback.UserFeignClientFallbackFactory; /** * @author 作者 owen * @version 創建時間:2017年11月12日 上午22:57:51 * 調用用戶中心中的userdetail對象,用戶oauth中的登錄 * 獲取的用戶與頁面輸入的密碼 進行BCryptPasswordEncoder匹配 */ @FeignClient(value="user-center",configuration = FeignExceptionConfig.class ,fallbackFactory = UserFeignClientFallbackFactory.class, decode404 = true) public interface UserFeignClient { /** * feign rpc訪問遠程/users-anon/login接口 * @param username * @return */ @GetMapping(value = "/users-anon/login", params = "username") LoginAppUser findByUsername(@RequestParam("username") String username); @GetMapping(value = "/users-anon/mobile", params = "mobile") LoginAppUser findByMobile(@RequestParam("mobile") String mobile); @GetMapping(value = "/users", params = "params") PageResult<SysUser> findUsers(@RequestParam Map<String, Object> params); } ``` **4\. 給 @FeignClient 注解配置異常回調** 給接口上的 @FeignClient 注解配置 fallback 屬性,實現請求被拒絕后的處理。 ~~~ @FeignClient(value="user-center",configuration = FeignExceptionConfig.class ,fallbackFactory = UserFeignClientFallbackFactory.class, decode404 = true) public interface UserFeignClient { } package com.open.capacity.uaa.feign.fallback; import java.util.Map; import org.springframework.stereotype.Component; import com.open.capacity.common.auth.details.LoginAppUser; import com.open.capacity.common.model.SysUser; import com.open.capacity.common.web.PageResult; import com.open.capacity.uaa.feign.UserFeignClient; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; @Slf4j @Component public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> { @Override public UserFeignClient create(Throwable throwable) { return new UserFeignClient() { @Override public LoginAppUser findByUsername(String username) { log.error("通過用戶名查詢用戶異常:{}", username, throwable); return new LoginAppUser() ; } @Override public LoginAppUser findByMobile(String mobile) { log.error("通過手機號查詢用戶異常:{}", mobile, throwable); return new LoginAppUser(); } @Override public PageResult<SysUser> findUsers(Map<String, Object> params) { log.error("查詢用戶列表異常:{}"); return null; } }; } } ~~~ **5. Sentinel在給Feign整合時,流控規則編寫的形式是 http請求方式://協議://服務名稱/請求路徑+參數 ** ``` GET:http://user-center/users-anon/login ``` * 配置說明 ![](https://img.kancloud.cn/6a/0d/6a0dccc69eb4d746b2ec8c3c301d0672_1900x908.png) * 流控說明: ![](https://img.kancloud.cn/4b/4e/4b4ea2b853dc37352ec39dc267ae9da2_1886x900.png) #### **Sentinel 與 OpenFeign 整合實現原理** 當 Sentinel 與 OpenFeign、Ribbon 整合時,客戶端向服務端發起一次請求的過程如下圖所示。 ![](https://img.kancloud.cn/f8/52/f85206983e73eb0e7febbcbbc6419c68_1771x745.png) 1. 當調用@FeignClient 接口的方法時,由 Sentinel 提供的方法調用攔截器(SentinelInvocationHandler)攔截方法的執行,根據接口方法上注解的 url 生成資源名稱,然后調用 Sentinel 的 SphU#entry 方法(完成所有 ProcessorSlot#entry 方法的調用),判斷當前發起的請求是否需要熔斷; 2. 非熔斷降級情況下,繼續將請求交給 OpenFeign 的 MethodHandler 處理; 3. OpenFeign 從 Ribbon 獲取一個服務提供者節點; 4. OpenFeign 使用 HttpClient 發起 HTTP 請求; 5. OpenFeign 請求成功或者異常(已經經過重試)時,調用 Sentinel 的 Entry#exit 方法(完成所有 ProcessorSlot#exit 方法的調用)更新當前時間窗口的請求成功總數、異常總數等指標數據。 Sentinel 處在接口調用的最前端,因此 Sentinel 統計的指標數據即不會受 Ribbon 的重試影響也不會受 OpenFeign 的重試影響。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看