春クラウドアリババ:センチネルは、電流制限ヒューズで達成

SpringBoot実際の電力供給のアイテムモール(20K +スター)住所:github.com/macrozheng / ...

概要

春クラウドアリババは、この記事の意志の詳細は、その使用方法など、そのコアコンポーネントの一つとしてセンチネルは、サービスおよび制限ヒューズ保護の範囲を持っている、マイクロサービスの開発のためのワンストップソリューションを提供することを約束します。

センチネルについて

人気のマイクロサービス、サービス、およびサービス間の安定性でますます重要になってきています。出発点、流量制御、ヒューズダウングレード、負荷保護システムの寸法安定性を保護複数のサービスとして流量センチネル。

Sentinelは次の特性があります。

  • 豊富なアプリケーションシナリオは:ほぼ10年間のアリババのコアシナリオデュアルXIは、例えば、トラフィックスパイクを促進着手する、リアルタイム・アプリケーションは、下流吹き使用できません。
  • 完全なリアルタイムの監視:リアルタイム監視を提供しながら。コンソールでの単一マシン・第二のデータアクセスアプリケーション、または500以下のクラスタサイズの動作にも概要を見ることができます。
  • ワイドオープンエコロジー:箱から出して、他のオープンソースのフレームワーク/ライブラリ統合モジュールを提供する、例えば、春の雲、ダボ、のgRPCとの統合。
  • SPIの完璧な拡張ポイント:、使いやすいだけでなく、SPI拡張ポイントを提供します。あなたは、拡張ポイント、迅速なカスタムロジックを実現することができます。

インストールセンチネルコンソール

センチネルコンソールは、リアルタイム監視リソースを表示して、スタンドアロンクラスタリソースの要約をするために使用することができ、軽量なコンソールアプリケーションであり、そのようなフロー制御ルール、降格のルールなどの管理機能の一連のルールを提供し、ホットスポットを支配します。

  • ここでは、ダウンロードされ、センチネルをダウンロードするには、公式サイトで開始しsentinel-dashboard-1.6.3.jarたファイル、ダウンロードアドレス:github.com/alibaba/Senを...

  • ダウンロードが完了した後、センチネルコンソールを実行するには、コマンドラインで次のコマンドを入力します。

java -jar sentinel-dashboard-1.6.3.jar
复制代码
  • センチネルコンソールは、ポート8080でデフォルトで実行さログオンアカウントのパスワードの両方sentinel、以下のアドレスを介してアクセスすることができます:HTTP:// localhostを:8080

  • センチネルコンソールは、単一のマシン上のデータのリアルタイム監視を表示します。

センチネル・サービス・モジュールを作成します。

ここでは、センチネルの溶断電流制限機能のプレゼンテーションのためのセンチネル・サービスモジュールを作成します。

  • pom.xmlにその依存関係を追加し、ここで我々は、我々が同時に依存ナコスを追加する必要があり、レジストリとしてナコスを使用します。
<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-sentinel</artifactId>
</dependency>
复制代码
  • 主にナコスとセンチネルコンソールの設定に対処し、application.ymlに設定を追加します。
server:
  port: 8401
spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置sentinel dashboard地址
        port: 8719
service-url:
  user-service: http://nacos-user-service
management:
  endpoints:
    web:
      exposure:
        include: '*'
复制代码

制限機能

すべてのHTTPサービスのためのセンチネルスターターデフォルト電流制限埋め点を提供し、我々はまた、@SentinelResourceを使用して、いくつかの制限の動作をカスタマイズすることができます。

作成RateLimitControllerクラス

溶断電流制限のためのテスト。

/**
 * 限流功能
 * Created by macro on 2019/11/7.
 */
@RestController
@RequestMapping("/rateLimit")
public class RateLimitController {

    /**
     * 按资源名称限流,需要指定限流处理逻辑
     */
    @GetMapping("/byResource")
    @SentinelResource(value = "byResource",blockHandler = "handleException")
    public CommonResult byResource() {
        return new CommonResult("按资源名称限流", 200);
    }

    /**
     * 按URL限流,有默认的限流处理逻辑
     */
    @GetMapping("/byUrl")
    @SentinelResource(value = "byUrl",blockHandler = "handleException")
    public CommonResult byUrl() {
        return new CommonResult("按url限流", 200);
    }

    public CommonResult handleException(BlockException exception){
        return new CommonResult(exception.getClass().getCanonicalName(),200);
    }

}
复制代码

よる制限リソース名

私たちは、(リソース名)@SentinelResource注釈が定義された値に応じて、現在の動作を制限することができますが、必要性は、処理ロジックを制限指定します。

  • 我々はナコスレジストリを使用しているため、フロー制御ルールは、センチネルコンソールで設定することができ、聞かせてのはナコスとセンチネル・サービスを開始します。

  • :センチネルは遅延ロードルールを使用しているため、我々はインターフェイスにアクセスする必要がある、センチネルコンソールは、このインターフェイスでは、私たちの最初の訪問、対応するサービスの情報を持っていますHTTP:// localhostを:8401 /レート制限/ byResource

  • 注釈@SentinelResourceの値に応じてフロー制御コンソールセンチネルルール、値を設定します:

  • インターフェイスの上部へのクイックアクセスは、電流制限、情報処理の彼らの定義を返すように見つけることができます:

URLによると制限

我々はまた、URL経由のアクセスを制限することができ、それはプロセス情報を制限するデフォルトの現在の状態に戻ります。

  • フロー制御を設定すると、センチネルコンソール、使用アクセスURLをルール:

カスタム処理ロジックフローリストリクタ

私たちは、一般的な制限処理ロジックをカスタマイズし、[@SentinelResourceを指定することができます。

  • CustomBlockHandlerは、処理ロジックを制限するためのカスタムクラスを作成します。
/**
 * Created by macro on 2019/11/7.
 */
public class CustomBlockHandler {

    public CommonResult handleException(BlockException exception){
        return new CommonResult("自定义限流信息",200);
    }
}
复制代码
  • RateLimitControllerのカスタム処理ロジックの使用を制限します:
/**
 * 限流功能
 * Created by macro on 2019/11/7.
 */
@RestController
@RequestMapping("/rateLimit")
public class RateLimitController {

    /**
     * 自定义通用的限流处理逻辑
     */
    @GetMapping("/customBlockHandler")
    @SentinelResource(value = "customBlockHandler", blockHandler = "handleException",blockHandlerClass = CustomBlockHandler.class)
    public CommonResult blockHandler() {
        return new CommonResult("限流成功", 200);
    }

}
复制代码

ヒューズ機能

Sentinelは、私たちは、この機能を発揮するために提供されるインタフェースRestTemplateナコスユーザーサービスのサービスを呼び出すために使用される操作を、融合の保護のためのサービス間の呼び出し、障害のアプリケーションをサポートしています。

  • まず、我々はRestTemplateインスタンスの下@SentinelRestTemplateをラップする必要があります。
/**
 * Created by macro on 2019/8/29.
 */
@Configuration
public class RibbonConfig {

    @Bean
    @SentinelRestTemplate
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
复制代码
  • CircleBreakerControllerクラスを追加し、コール・インターフェースは、ナコスユーザーサービスの定義を提供します。
/**
 * 熔断功能
 * Created by macro on 2019/11/7.
 */
@RestController
@RequestMapping("/breaker")
public class CircleBreakerController {

    private Logger LOGGER = LoggerFactory.getLogger(CircleBreakerController.class);
    @Autowired
    private RestTemplate restTemplate;
    @Value("${service-url.user-service}")
    private String userServiceUrl;

    @RequestMapping("/fallback/{id}")
    @SentinelResource(value = "fallback",fallback = "handleFallback")
    public CommonResult fallback(@PathVariable Long id) {
        return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
    }

    @RequestMapping("/fallbackException/{id}")
    @SentinelResource(value = "fallbackException",fallback = "handleFallback2", exceptionsToIgnore = {NullPointerException.class})
    public CommonResult fallbackException(@PathVariable Long id) {
        if (id == 1) {
            throw new IndexOutOfBoundsException();
        } else if (id == 2) {
            throw new NullPointerException();
        }
        return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
    }

    public CommonResult handleFallback(Long id) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    public CommonResult handleFallback2(@PathVariable Long id, Throwable e) {
        LOGGER.error("handleFallback2 id:{},throwable class:{}", id, e.getClass());
        User defaultUser = new User(-2L, "defaultUser2", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }
}
复制代码
  • スタートナコス・ユーザー・サービスとセンチネル・サービスサービス:

  • 私たちがナコス・ユーザー・サービスに4のユーザIDを定義していないので、次のインターフェイスへのすべてのアクセスは、サービス低下の結果に戻ります:HTTP:// localhostを:8401 /ブレーカ/フォールバック/ 4

{
	"data": {
		"id": -1,
		"username": "defaultUser",
		"password": "123456"
	},
	"message": "服务降级返回",
	"code": 200
}
复制代码

装うと組み合わせて使用​​します

Sentinelはまた装うコンポーネントに合わせて、我々はサービスコールの間の時間に装うを使用し、あなたも爆破するためにそれを使用することができます。

  • まず、我々はのpom.xmlに装うにその依存関係を追加する必要があります。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
复制代码
  • でapplication.ymlに装うためのオープンサポートをセンチネル:
feign:
  sentinel:
    enabled: true #打开sentinel对feign的支持
复制代码
  • 装う機能を起動するアプリケーション起動クラス@EnableFeignClientsに追加します。

  • ナコス・ユーザー・サービスのサービスへの呼び出しを定義するUserServiceのインターフェースを作成します。

/**
 * Created by macro on 2019/9/5.
 */
@FeignClient(value = "nacos-user-service",fallback = UserFallbackService.class)
public interface UserService {
    @PostMapping("/user/create")
    CommonResult create(@RequestBody User user);

    @GetMapping("/user/{id}")
    CommonResult<User> getUser(@PathVariable Long id);

    @GetMapping("/user/getByUsername")
    CommonResult<User> getByUsername(@RequestParam String username);

    @PostMapping("/user/update")
    CommonResult update(@RequestBody User user);

    @PostMapping("/user/delete/{id}")
    CommonResult delete(@PathVariable Long id);
}
复制代码
  • UserFallbackServiceクラスが実装を作成UserServiceのインタフェース、サービス低下を処理するためのロジック:
/**
 * Created by macro on 2019/9/5.
 */
@Component
public class UserFallbackService implements UserService {
    @Override
    public CommonResult create(User user) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    @Override
    public CommonResult<User> getUser(Long id) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    @Override
    public CommonResult<User> getByUsername(String username) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    @Override
    public CommonResult update(User user) {
        return new CommonResult("调用失败,服务被降级",500);
    }

    @Override
    public CommonResult delete(Long id) {
        return new CommonResult("调用失败,服务被降级",500);
    }
}
复制代码
  • 装うインタフェースUserFeignControllerコールナコスユーザーサービスのサービスでUserServiceの使用:
/**
 * Created by macro on 2019/8/29.
 */
@RestController
@RequestMapping("/user")
public class UserFeignController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public CommonResult getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }

    @GetMapping("/getByUsername")
    public CommonResult getByUsername(@RequestParam String username) {
        return userService.getByUsername(username);
    }

    @PostMapping("/create")
    public CommonResult create(@RequestBody User user) {
        return userService.create(user);
    }

    @PostMapping("/update")
    public CommonResult update(@RequestBody User user) {
        return userService.update(user);
    }

    @PostMapping("/delete/{id}")
    public CommonResult delete(@PathVariable Long id) {
        return userService.delete(id);
    }
}
复制代码
{
	"data": {
		"id": -1,
		"username": "defaultUser",
		"password": "123456"
	},
	"message": "服务降级返回",
	"code": 200
}
复制代码

使用ナコスストレージルール

我々はセンチネルコンソールでルールを設定する場合、デフォルトで、コンソールプッシュルールをメモリに直接クライアントやアップデートへのAPI規則を介して行われます。私たちは、アプリケーションを再起動すると、ルールが消えます。ここでは、ナコスの例を格納するための永続化のために次のルールを設定する方法について説明します。

回路図

  • まず、我々は物流センターに直接ルールを作成し、物流センターは、クライアントにプッシュ支配します。

  • コンフィギュレーション・センターから設定情報を取得するために、コンソールセンチネル。

デモ

  • 最初のpom.xmlにその依存関係を追加します。
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
复制代码
  • 設定ファイルを変更Application.yml、ナコスデータ・ソース構成を追加します。
spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-sentinel
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
复制代码
  • ナコスの追加構成では:

  • 設定情報を追加し、次のとおりです。
[
    {
        "resource": "/rateLimit/byUrl",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
复制代码
  • 関連するパラメータの解釈:

    • リソース:リソース名。
    • limitApp:ソース・アプリケーション。
    • グレード:しきい値タイプ、スレッドの数が0を表し、1はQPSを表します。
    • 数:単一の閾値;
    • 戦略:フロー制御モード、直接、1関連付けを表す、2表しリンク0を表します。
    • controlBehavior:流体工学の効果は、待って、2つの意味をウォームアップを表し速い失敗0、1を表し;
    • clusterMode:クラスタかどうか。
  • センチネルコンソールは、以下の制限のルールを発見しました。

  • テストインタフェースへのクイックアクセスを制限するプロセス情報を返すために見つけることができます:

参考資料

春クラウドアリババ公式文書:github.com/alibaba/spr ...

モジュールを使用するには

springcloud-learning
├── nacos-user-service -- 注册到nacos的提供User对象CRUD接口的服务
└── sentinel-service -- sentinel功能测试服务
复制代码

プロジェクトのソースアドレス

github.com/macrozheng/...

いいえ公共ありません

モールは、プロジェクトで連載フルチュートリアル国民の関心番号取得する最初の時間を。

いいえ公共絵ません

おすすめ

転載: juejin.im/post/5dd29bece51d4561e80f9053