[Sentinelは]統合アポロのベストプラクティスをセンチネル
序文
センチネルデフォルトのコンソール設定のルールに関する情報は、それらのメモリです。コンソールのクライアント側またはセンチネルセンチネルを再起動しているかどうかそう。あなたが設定されたルールは失われます。あなたの会社やあなたの場所は悪くないお金であれば、持続的なルールを達成するためにセンチネルオンライン環境を使用し、またはアリクラウド、または自身の有料版にお金を費やすしたい場合は、直接支払うことで、この記事をオフにしますそれのバージョン、ピットの多くにステップする必要がなくなります。それとも、異端だので、私たちは下って行きました。
aplloと統合する際に、本当に、ピットを強化するので、この記事を書くための理由についての最初の話は、皮肉を辞任しました。もう一つのポイントは、行うには、アポロの統合についての記事、すべての制限ルールがモデル化されているDEMOの公式の多くを見つけることです。ただし、パラメータを制限するセンチネルルールヒューズルールは、システム、黒と白のリストと非常に多くのルールを制限し、存在し、各ルールの詳細に不整合があり、これらは言及されていない、いくつかのクライアントは、これ以上のピットがあります。彼がリーダーを助けることを望んで、少しの経験と経験、そしてこの種で、非常に多くのピットを踏ん。
ソースコードを変更するセンチネルコンソールを引いて
あまりにも多くのコンテンツ、この記事では詳述しないので、次は、すべてのコンテンツのスクリーンショット、この記事の執筆時点ので、マスター開発中バージョン1.7、スナップショットのバージョンの数が多いです。変更を行うために、現在の安定した1.6ブランチにカットされます。私は以下の内容の変形例であり、私のgithubのにフォークセンチネルを持っているアドレスは、
レビューポイント1:すべてのルールを実装し、インタフェースを押し引き上げ
すべてのルールの設定とプッシュプルのプロバイダーやパブリッシャーを実現するために追加します。
ポイント2を変更します。操作コンソールのAPIで使用されるルールを変更します。
動作制御コンソール内のルールの多数の変換。
ポイント3を変更します。xxEntityを変更します。
最後の点は、ほとんどのピットは、それ自体で、何もしxxEntityクラスですエンティティクラス規則の多数を変更しないで保存され、直接JSONのソースですが、JSONのチェックを使用してクライアント統合春-クラウドアリババため、クライアントとのアポロエンティティクラスのJSONは少し異なる保存した場合、それが報告さ0のルールを変換するが、1つのルールがあるデータソースRuleCLass :. FlowRuleからは。それは非常に困惑していない、そこにこの与えられてJSON形式の変換エラーと、ここで何である春クラウドアリババ JSON変換コードが。
ブラザー、この異常な食をこのコードを書き、作る//起こることはありませんコメントを、私は、これは非常に厳しい戦いピットで与えられていた理解することができ、後から右ここでの問題であることが判明?以降、同様の問題は、2つのGitHubに見出される問題1、問題2は、この方法は、以下のフィールドの全てプラス@JSONField(偽=シリアライズ)溶液でxxEntityによる。
ポイント4を確認します。解除の設定は起動時に渡すことが可能になります
次の設定を追加します。
コンソールの修正版を使用して
- あなたは上記の修正自身で公式コードワードをセンチネルforkし、その後、パッケージ化することができます
- あなたはセンチネルのコードに直接移動ダウン私のフォークを引くことができます
- あなたは、私が殴られてきたパッケージを使用することができますアドレスを
カスタム構成
設定名 | 必須 | デフォルト値 | 効果 |
---|---|---|---|
ENV | ノー | DEV | 環境アポロの使用を指定します |
app.id | ノー | センチネル・アポロ | アポロアプリケーションIDのセンチネルを保存するルールを指定します |
cluster.name | ノー | デフォルト | クラスタアポロの使用を指定されたセンチネルを保存 |
namespace.name | ノー | 応用 | アポロを使用して名前空間を指定されたセンチネルを保存 |
modify.user | それはあります | アポロコンソールは、このアプリケーションのために、このアカウントへのアクセス権を持っていることを確認し、修正者アカウントを表示します | |
modify.comment | ノー | センチネル・ダッシュボードによって修正 | アポロコンソールの表示は、発言を変更します |
release.user | それはあります | アポロコンソールは、このアプリケーションのために、このアカウントへのアクセス権を持っていることを確認し、出版社のアカウントを表示します | |
release.comment | ノー | センチネル・ダッシュボードによってリリース | アポロコンソールは、リリースノートを表示します |
apollo.portal.url | それはあります | アドレスアポロコンソール | |
apollo.application.token | それはあります | アポロアプリケーションOpenAPIのトークンのセンチネルルールを保存指定します | |
authority.key.suffix | ノー | 権限 | アポロの認証ルールは、キーの接尾辞に保存されています |
degrade.key.suffix | ノー | 劣化します | アポロヒューズ規則は、キーの接尾辞に保存されています |
flow.key.suffix | ノー | フロー | キーアポロサフィックスに保存されている制限のルール |
param.key.suffix | ノー | param_flow | キーアポロサフィックスに格納されているパラメータを制限するルール |
system.key.suffix | ノー | システム | キーアポロサフィックスに格納されているシステム制限ルール |
auth.username | ノー | センチネル | センチネルコンソールのログインユーザー名 |
auth.password | ノー | センチネル | センチネルコンソールのログインパスワード |
サーバポート | ノー | 8080 | センチネルコンソール発射ポート |
アポロの構成
センチネルの保全のためのプロジェクトを作成します。
- プロジェクトの作成]ボタンをクリックしてください
- プロジェクト情報を入力します。
- アプリケーションID、上記テーブルに対応app.id
- 塗布ヘッド上記対応表modify.userとrelease.user
- 共通の名前空間を作成します
- 右下隅の名前空間に追加]ボタンをクリックします
- 名前空間を作成します。
- 上記のテーブルに対応する名前namespace.name、脱感作部署の名前が含まれるように名前を注意してください
- 公共の種類を選択してください、と言うでしょうその背後にある理由
- 右下隅の名前空間に追加]ボタンをクリックします
- 公開された名前空間
- プライベートスペース継承することができない、無使用のアプリケーション、あなたが削除することができます
- それが公開されているので、他のアプリケーションはアポロから継承することができ、アポロは、このようなプロジェクトのための最小限の変更を統合されているので、ここで我々の意図は、アポロルールを保存用に別のアプリケーションを分離することです
- APIへのアクセス不能、我々は一度公開する最初の公共空間を構築し、赤のヒントに注意してください
- プライベートスペース継承することができない、無使用のアプリケーション、あなたが削除することができます
- このプロジェクトのために認可オープンプラットフォームを作成します。
- 右上隅をクリックしてオープンプラットフォームの権限管理
- アプリケーションの作成
- サードパーティ製のアプリケーションIDは、あなたがAPPIDをプロジェクトの上に作成されます
- サードパーティ製のアプリケーション名何気なく書か
- エンパワーメント
- トークンあなたはをクリックしてアプリケーションの後に自動生成
- マネージドAPPIDはあなたが項目の上に作成したAppIDされます
- 認証の種類は、アプリケーションを選択する必要があります
- 右上隅をクリックしてオープンプラットフォームの権限管理
春ブーツ統合センチネル
ソースアドレス
依存性の導入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>1.5.2</version>
</dependency>
テストコントローラ
package cn.coder4j.study.example.sentinel;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author buhao
* @version TestController.java, v 0.1 2019-09-19 20:53 buhao
*/
@RequestMapping("/test")
@Controller
public class TestController {
/**
* 没有注解通过自适应的限流
* @return
*/
@GetMapping("/flowRule")
@ResponseBody
public String flowRule(){
return "success";
}
/**
* 通过手动注解的限流
* @return
*/
@GetMapping("/flowRuleWithAnno")
@ResponseBody
@SentinelResource("flowRuleWithAnno")
public String flowRuleWithAnno(){
return "success";
}
/**
* 参数限流规则测试
* @param param
* @return
*/
@GetMapping("/paramFlowRule")
@ResponseBody
@SentinelResource("paramFlowRule")
public String paramFlowRule(String param){
return "success";
}
/**
* 熔断规则测试
* @return
*/
@GetMapping("/degradeRule")
@ResponseBody
@SentinelResource("degradeRule")
public String degradeRule(){
throw new RuntimeException("服务器异常");
}
}
設定application.yml
apollo:
bootstrap:
enabled: true # 开启 apollo
meta: xxx # 指定 apollo 注册地址
app:
id: sentinel-apollo # 指定规则项目在 apollo 的app.id,要与 sentinel 控制台启动参数一致
spring:
application:
name: study-sentinel-example # 应用名称,不同项目要唯一,会把他做为规则 Key 的前缀
cloud:
sentinel:
transport:
dashboard: localhost:8989 # sentinel 控制台的地址
datasource:
ds1:
apollo:
namespace-name: {部门名}.sentinel-rule # 保存规则的 apollo 应用的公共 namespace, 要与 sentinel 控制台启动参数一致
rule-type: flow # 指定该数据源是限流规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds1.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds2:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: degrade # 指定该数据源是熔断规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds2.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds3:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: param_flow # 指定该数据源是参数限流规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds3.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds4:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: system # 指定该数据源是系统限流规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds4.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds5:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: authority # 指定该数据源是认证限流(黑白名单)规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds5.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
センチネルコンソール構成
- 最初のスタートセンチネルは、あなたがそれを使用して数回の要求インタフェース限り、何のアプリケーションデータではありません
- リクエストは、右側のリストに私たちのアプリケーションを見ることができた後、
- 首先点击簇点监控,如果是空白的话说明,接口还没有被请求过,通过上面提供的 jmeter 脚本,可以快速访问所有接口,访问后如下图所示
- 可以看到除了我们手动通过注解定义的资源名,还多了一些是通过我们的 controller 路径的资源名,这些都是我们客户端集成 spring-cloud-starter-alibaba-sentinel 包后,自动适配的。这两种其实在使用上有区别的
- 自动适配的限流后会返回 Blocked by Sentinel (flow limiting)
- 通过注解的是会抛出 UndeclaredThrowableException 异常,我们可以通过 文章 说的方法转成我们想的限流异常处理。
- 右边的操作就是添加各种规则,这里修改后会实时同步到客户端并同步保存到 apollo
- 可以看到除了我们手动通过注解定义的资源名,还多了一些是通过我们的 controller 路径的资源名,这些都是我们客户端集成 spring-cloud-starter-alibaba-sentinel 包后,自动适配的。这两种其实在使用上有区别的
jmeter 配置
jmeter 是用于测试与验证规则使用的,因为可以设置线程数,所以可以很好的测试限流情况。测试脚本下载
线程组要把线程设置成 100,方便后面的统计,另外为了在一秒内执行完,Ramp-Up 时间设为0
请求默认值就是填写你本地的启的测试项目的地址
xx 规则填写测试接口地址,参数限流因为要做对照实验所以写了两个
查看结果树可以看到你每次请求的内容与结果
可以看到上张图片内有红色的有绿色的,红色说明断言失败,绿色说明断言成功,断言的内容就是包含 success
聚合统计,这个可以统计出100个线程请求后的总体结果,我们只要看 Error% 的失败率就可以了。图中可以看到除了熔断限流,其它限流失败率是 0
测试步骤
- 在簇点链路中找到 /test/flowRule,并点击流控按钮
- スタンドアローン10のしきい値を満たし、[追加]をクリックします
- 新しいルールの後のページフローにジャンプします
- jemterを実行して、あなたは90%の故障率を見ることができ、これはあなたが成功を制限していることを意味し
- これは、失敗は成功を返さない主張は、それを彼が何を返すようになりましであるため、成功していないと言いますか?
- 応答の数を見て、結果ツリー、レコードの詰め物の封筒を参照してください。
- あなたが「のリターン見ることができセンチネル(フロー制限)によってブロックさを」、これは統合ページの戻り値を制限する設定である、あなたができるspring.cloud.sentinel.servlet.block-ページあなた自身のページとして指定し
- また、オープンアポロが見ることができ、ルールよりも、これは先ほど追加した制限ルールであります
私は公共の番号「KIWI隋Suinian」の注意を歓迎し、またコレクション私のブログ