目次
概要
分散開発でもマイクロサービス開発でも、コンポーネント、つまりサービスガバナンスセンターに連絡する必要があります。サービスを検出する機能を提供するコンポーネントが必要です。レジストリは、zookeeperなどのフレームワークで実行できます。 、reids、eurekaなど。このシリーズはspringcloudに焦点を当てているため、この記事では主にeurekaコンポーネントを紹介します。これらのタイプのレジストリの違いについては、後で説明します。
ユーレカ入門
Spring cloud eurekaは、netflix eurekaに基づくセカンダリパッケージです。主にマイクロサービスアーキテクチャでのサービスガバナンス機能の実装を担当します。Springcloudeurekaは、httpプロトコルの残りの通信方法に基づいており、対応するクライアントコンポーネントを提供します。非常に便利なサービスガバナンスである。サービスガバナンスにはレジストリが必要です。eurekaをレジストリとして使用するだけでなく、zookeeperをレジストリとして使用することもできます。Aliのオープンソースのdubboフレームワークは、zookeeperをレジストリとしてサポートできます。dubboを使用したことのある人は、dubboがさらにzookeeperを提供することを知っています。 zookeeper。レジストリとして、redisなどのフレームワークをレジストリとしてサポートすることもできます。マイクロサービスを初めて使用する人や分散している人は、サービスレジストリが何であるかを知らない可能性があります。簡単に説明します。この写真をご覧ください。
上の図は、レジストリの主な機能を示しています。プロデューサーは、コンシューマーとしてレジストリからサービスを提供したり、サービスを要求したりできます。登録センターがよくわからない場合は、下の写真をご覧ください。
ユーレカ実戦闘
開発ツール:IDEA、jdkバージョン:1.8 maven 3.5.4
サービスレジストリの開発
1.空のプロジェクトを作成し、springcloud-blogという名前を付けます
プロジェクトを開いた後、新しいモジュールを追加します
2.新しいモジュールを追加します
[次へ]をクリックして、プロジェクトの作成を完了します
3.依存関係を追加します。後続の操作の一貫性を確保するために、次の依存関係をpomファイルにコピーすることをお勧めします。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.ユーレカサービスガバナンス機能をオンにします
添加@EnableEurekaServe注解开启
@SpringBootApplication
//开启服务治理功能
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
5.ユーレカセキュリティ認証を実現する統合セキュリティフレームワーク
次の構成クラスを追加します
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
}
6.構成ファイルを編集します
アイデアによって作成されたspringbootプロジェクトがデフォルトで使用され、生成された構成ファイルはapplication.propertiesです。より簡潔で明確なyml形式を使用して、サフィックスapplication.ymlを直接変更することをお勧めします。
次のコンテンツを貼り付けます
spring:
application:
# 服务名
name: eureka-server
# security安全认证配置
security:
user:
name: yangle
password: 123
server:
port: 8761
eureka:
client:
# 该应用为注册中心,不需要向注册中心注册自己
register-with-eureka: false
# 关闭检索服务的功能,只需要维护服务
fetch-registry: false
7.mainメソッドを実行してeurekaを起動します
8.起動後のテストでエラーが報告されます
この行を削除してから、テストパッケージを再インポートします
9.プロジェクトの開始後、http:// localhost:8761 /にアクセスし、ユーザー名とパスワードを入力しますyangle 123
上記のページを見ると、eurekaが正常に開始され、サービスプロデューサーが開発されていることがわかります。
サービスプロデューサー開発
1.スプリングブートプロジェクトを作成します
プロジェクトがビルドされると、右下隅に[表示]をクリックするように求めるプロンプトが表示され、springbootプロジェクトを簡単に開始できます。
2.依存関係をコピーします
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.サービス検出機能をオンにし、アプリケーションファイルを編集して、追加します。
@EnableDiscoveryClient
@SpringBootApplication
//开启服务发现功能
@EnableDiscoveryClient
public class EurekaClientProducterApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientProducterApplication.class, args);
}
}
4.前と同じように、構成ファイルのサフィックスをymlに変更し、以下をコピーします
spring:
application:
name: eureka-client-order-service
server:
port: 8081
eureka:
client:
serviceUrl:
# 指定注册中心
defaultZone: http://yangle:123@localhost:8761/eureka
instance:
#可选
preferIpAddress: true
#实例ID支持自定义,可选
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
5.サービスを受けるための注文を追加します
@RestController
public class OrderService {
@RequestMapping("getOrder")
public String getOrder(){
return "{code:0,data:{}}";
}
}
6.このプロジェクトを開始して、正常に開始されるかどうかを確認しましょうhttp:// localhost:8081 / getOrder
http:// localhost:8761 /を再度開くと、プロデューサーがレジストリに登録されていることがわかります。
サービス消費者開発
、プロデューサーと同じように、プロジェクト名をeureka-client-consumerに変更するだけです
1.ymlファイルを変更します
spring:
application:
name: eureka-client-order-consumer-service
server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://yangle:123@localhost:8761/eureka
instance:
preferIpAddress: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
2.restTemplateをコンテナに挿入します。SpringRestTemplateはRestサービスにアクセスするためにSpringが提供するクライアントです。RestTemplateはリモートHttpサービスにアクセスするためのさまざまな便利なメソッドを提供します。サードパーティのサービスプロバイダーは、RestTemplateを使用して安らかなサービスを要求します
@SpringBootApplication
public class EurekaClientConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientConsumerApplication.class, args);
}
@Bean(name = "restTemplate")
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
3.プロデューサーが提供するサービスを呼び出すためのインターフェースを追加します
@RestController
public class OrderConsumerService {
@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;
@RequestMapping("getOrder")
public String getOrder(){
//IP替换为自己的本地IP
return restTemplate.getForObject("http://IP:8081/getOrder",String.class);
}
}
ここでは、resttemplateを使用してこのサービスを呼び出します。この呼び出し方法は単純ですが、サービスをクラスターにデプロイすると、呼び出すノードを指定するため、負荷分散を迅速に実行することが難しいという欠点があります。サービス、もちろん、この春の雲も私たちのことを考えていました
4.アノテーション@LoadBalancedを使用して、サービス名を呼び出し、構成コンテンツを変更します
@SpringBootApplication
public class EurekaClientConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientConsumerApplication.class, args);
}
@Bean(name = "restTemplate")
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean(name = "restTemplate2")
@LoadBalanced
public RestTemplate getRestTemplate2() {
return new RestTemplate();
}
}
5.ロードバランス機能を実装するresttemplateを追加します
@RestController
public class OrderConsumerService {
@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;
@Autowired
@Qualifier("restTemplate2")
private RestTemplate restTemplate2;
@RequestMapping("getOrder")
public String getOrder(){
return restTemplate.getForObject("http://192.168.31.168:8081/getOrder",String.class);
}
// 实现负载均衡的服务,不需要指定节点,只需要指定使用的服务名称
@RequestMapping("getOrderForLoadBalence")
public String getOrderForLoadBalence(){
return restTemplate2.getForObject("http://eureka-client-order-service/getOrder",String.class);
}
}
6.プロジェクトを開始した後、新しいインターフェイスに再度アクセスして、アクセスが成功したかどうかを確認します
7.ユーレカの顔を見て見てください。消費者も登録しているのを見ました
高可用性ユーレカを実現
実装の原則:新しい登録センターを追加し、それらを相互に登録して高可用性を実現する
eureka-serverプロジェクトをコピーし、名前をeureka-server-slaveに変更します。
eureka-server-slaveの構成ファイルを変更します
spring:
application:
name: eureka-server
security:
user:
name: yangle
password: 123
server:
port: 8762
eureka:
client:
serviceUrl:
defaultZone: http://yangle:123@localhost:8761/eureka
eureka-serverの構成ファイルを変更します
spring:
application:
name: eureka-server
security:
user:
name: yangle
password: 123
server:
port: 8761
eureka:
client:
serviceUrl:
defaultZone: http://yangle:123@localhost:8762/eureka
生産者と消費者の構成ファイルを変更する
生产者
spring:
application:
name: eureka-client-order-service
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://yangle:123@localhost:8761/eureka,http://yangle:123@localhost:8762/eureka
instance:
preferIpAddress: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
消费者
spring:
application:
name: eureka-client-order-consumer-service
server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://yangle:123@localhost:8761/eureka,http://yangle:123@localhost:8762/eureka
instance:
preferIpAddress: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
新しい登録センターの住所を追加し、同時に2つの登録センターにサービスを登録します
再起動、機能の確認
!!!これで実際の戦闘機能は終了です。次に、理論的な知識を自分に追加します。
動物園の飼育係とユーレカの違い
分散分野にはよく知られているCAP定理があるため、3つが同時に存在することは不可能です。AP、CP、CAPは何を表していますか?
C:一貫性
A:可用性
P:パーティションのフォールトトレランス
次に、CAPが同時に共存できない理由について説明します。これは、データの整合性を確保する場合は、データをロックし、データが他のノードと同期されたときに新しいデータの生成を停止する必要があるためです。このとき、新しいリクエストは拒否されるか、ユーザーをブロックされた待機状態のままにして、同期が完了した後にのみ解放し、新しいリクエストを受信または処理すると、サービスが利用できなくなります。同様に、サービスの可用性が保証されている場合は、データ同期ロック操作を実行できないため、データの整合性に必要な条件と矛盾します。これは、CAが相互に解決できないメタ幼児です。クラスターの場合、P、Pが存在する必要があると言う人もいます。 、次にPが存在する必要があります。
動物園の飼育係とユーレカの違いについて話しましょう。飼育係はCPに基づいており、Aを破棄します。彼はしばしばDUBBOと組み合わせます。EUREKAはAPを強調します。一貫性
引用されたコンテンツ:https://blog.csdn.net/alan_gaohaodong/article/details/82899413
Zookeeperは、CPの原則を保証します。1.1
登録センターからサービスリストを照会する場合、登録センターが数分前に登録情報を返すことは許容できます
が、サービスを直接受け入れることはできず、利用できません。つまり、サービス登録機能には、一貫性よりも可用性に対する要件が高くなります。
ただし、zkにはこのような状況があり、ネットワーク障害のためにマスターノードが他のノードとの接続を失った場合、残りの登録
機能によってリーダーの選出が再開されます。問題は、リーダーの選出時間が30〜120秒と長すぎ
、選挙中にzkクラスター全体が利用できなくなり、選挙中の登録サービスが麻痺することです。クラウド展開環境
では、ネットワークの問題によりzkクラスターがマスターノードを失う可能性が高くなります。サービスは最終的には復旧できますが、
選出時間が長いために長期的に登録できなくなることは許されません。
1.2 Eurekaはこれを理解しているため、設計時の使いやすさを優先します。Eurekaのすべてのノードは同等
であり、いくつかのノードに障害が発生しても通常のノードの動作には影響せず、残りのノードは引き続き登録およびクエリサービスを提供できます。
EurekaクライアントがEurekaに登録するか、リンクに障害が発生した場合は、自動的に他のノードに切り替わります
.1つのEurekaがまだ存在している限り、登録サービスが利用可能であることが保証されます(利用可能であることが保証されます)。ただし、情報が見つかりました。最新ではない可能
性があります(一貫性は保証されません)。さらに、Eurekaには自己保護メカニズムもあります。
ノードの85%以上が15分以内に正常なハートビートを持たない場合、Eurekaは、クライアントとレジストリの間にネットワーク障害があると考えています。現時点では、が存在することになる
いくつかの状況。:
(1)Eurekaは、ハートビートを長時間受信していないために期限切れになるはずのサービスを登録リストから削除しません。
(2)Eurekaは、新しいサービスの登録とクエリ要求を受け入れることができますが、他のサービスと同期されません。ノード
(現在のノードがまだ利用可能であることを保証します)
(3)ネットワークが安定している場合、新しい登録情報の現在のインスタンスは他のノード
と同期されるため、Eurekaはネットワーク障害による状況にうまく対処できます。連絡が途絶えましたが、zkが気に入らなかった
登録サービス全体が麻痺しています。
ユーレカ面接の質問と回答について
1.CAPを導入する
答えは上記の通りです
2.EUREKAとzookeeperの違い
答えは上記の通りです
総括する
この章の紹介を通じて、レジストリとは何かを学び、レジストリ機能のフレームワークを提供することができました。次に、eurekaのエントリレベルの使用法と、eurekaレジストリの高可用性を確保する方法を紹介しました。 、最後にzookeeperとeurekaの違いと一般的なインタビューについて説明しました。eurekaに関する質問については、後でspringcloudの関連知識について説明し、次のセクションではクライアントに負荷分散を実装する方法を紹介します。
私の公式アカウントに注意を払い、eurekaに返信し、この章のソースコードを入手し、「情報を受け取る」に返信し、人工知能やビッグデータなどの学習ビデオ資料を入手してください。侵害がある場合は、すぐに削除するには、作者に連絡してください。