Webサービスとアカウント・サービス、春・クラウドkubernetesが提供する登録発見機能、Webベースの達成:この記事では、「春・クラウドkubernetes戦闘シリーズの第4の主コンテンツでkubernetes上の2つのアプリケーションを展開することです提供するHTTPサービスを呼び出すためのサービスアカウントサービス。
シリーズ一覧
- 「春クラウドkubernetes公式デモは本当の実行します」
- 「こんにちは春 - クラウドkubernetes」
- 「後ろの3つの主要な知識ポイントスプリング・クラウドkubernetes」
- 「(融合を含む)は、実際のサービスの発見とポーリングを春クラウドkubernetes」
- 「SpringCloudゲートウェイ与春-クラウドkubernetes」
- 「春クラウドkubernetesとconfigmapのK8S」
フル概要
本論文では、その次の段落で構成されています。
- 環境情報
- 登録された一般的なSpringCloudが一目でサービスを発見します
- 登録サービス分析を達成するためにどのようにkubernetesを見つけました
- この章では、実際のソースコードのダウンロードリンク
- アカウント・サービスの戦闘開発サービス(サービスプロバイダ)
- 戦闘開発Webサービスのサービス(サービスコンシューマ)
- 拡張リボンポーリング機能を検証します
- ヒューズを検証する機能
環境情報
次のように実際の環境とバージョン情報は、次のとおりです。
- オペレーティングシステム:CentOSのLinuxは1810年6月7日にリリース
- minikube:1.1.1
- Javaの:1.8.0_191
- Mavenの:3.6.0
- fabric8-のmaven-pluginのプラグイン:3.5.37
- 春・クラウドkubernetes:1.0.1.RELEASE
Linuxでは、minikube、ジャワ、Mavenの、準備ができていることを確認してください上で、Linux環境のインストールをminikubeとを参照してくださいスタートアップ「Linuxのインストールガイドminikube」。
登録された一般的なSpringCloudが一目でサービスを発見します
SpringCloud環境の最も重要な機能は、登録された発見サービスですので、SpringCloudは、移行時にkubernetes環境と開発の問題への応用が最も懸念してkubernetesに行くために彼らのサービスを公開する方法で、どのように他のマイクロサービスを呼び出すこと。
図は、春の公式ブログから来て、通常のSpringCloud環境で見つかっ登録を見てみましょう、アドレスは次のとおりです。https://spring.io/blog/2015/07/14/microservices-with-spring、
図からわかる、アカウント・サービスのアプリケーションはユーレカに自分自身を登録し、このWebサービス「アカウントサービス」とは、ユーレカのアカウント・サービス・サービスのアドレスを見つけることができる、として正常アカウント-サービス安らかにリクエストを送信し、それを過ごすことになります提供するサービス。
登録サービス分析を達成するためにどのようにkubernetesを見つけました
上記のWebサービスとアカウント・サービスは2 kubernetesに適用した後に移行する場合は、登録された検出メカニズムは、それを鋸なり?
最初:何のインフラとどのような違いがないkubernetesがないので、マップ上の道をたどる、それはまた、kubernetesにユーレカに展開されます。
第二は、春・クラウドkubernetesフレームワークの使用を戦うために今日の内容であります:kubernetesは、以下に示すように、既存のSpringCloudアプリケーションアーキテクチャを提供するネイティブの機能を呼び出すことができ
、この図は、サービスアカウント、サービスアプリケーションを起動するために、示したWebサービス・アプリケーションAPIサーバー、APIにokhttpとサービスのリストをリクエストしますサーバーは、アカウント・サービスポッドポーリング複数の要求を開始することができる要求はWebサービスのアカウント・サービスの情報があるように、etcd Webサービスアプリケーションにデータを返すためにかかる受け取ります。
そこに注意してください詳細上のマップです:Webサービスアプリケーションを作成kubernetesでサービスアカウント、サービスに直接要求を送信しませんが、しかし、具体的なポッドに直接送信され、その理由は、この能力を持っている、ばねクラウドkubernetes理由次のように、この基準ソース論理よいKubernetesServerList.javaに対応する全てのポッド(エンドポイント)アカウントサービスの情報を取得するサービスによってフレーム。
public List<Server> getUpdatedListOfServers() {
//用namespace和serviceId做条件,得到该服务对应的所有节点(endpoints)信息
Endpoints endpoints = this.namespace != null
? this.client.endpoints().inNamespace(this.namespace)
.withName(this.serviceId).get()
: this.client.endpoints().withName(this.serviceId).get();
List<Server> result = new ArrayList<Server>();
if (endpoints != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Found [" + endpoints.getSubsets().size()
+ "] endpoints in namespace [" + this.namespace + "] for name ["
+ this.serviceId + "] and portName [" + this.portName + "]");
}
//遍历所有的endpoint,取出IP地址和端口,构建成Server实例,放入result集合中
for (EndpointSubset subset : endpoints.getSubsets()) {
if (subset.getPorts().size() == 1) {
EndpointPort port = subset.getPorts().get(FIRST);
for (EndpointAddress address : subset.getAddresses()) {
result.add(new Server(address.getIp(), port.getPort()));
}
}
else {
for (EndpointPort port : subset.getPorts()) {
if (Utils.isNullOrEmpty(this.portName)
|| this.portName.endsWith(port.getName())) {
for (EndpointAddress address : subset.getAddresses()) {
result.add(new Server(address.getIp(), port.getPort()));
}
}
}
}
}
}
else {
LOG.warn("Did not find any endpoints in ribbon in namespace ["
+ this.namespace + "] for name [" + this.serviceId
+ "] and portName [" + this.portName + "]");
}
return result;
}
理論的解析が完了した後、我々はそれを戦うようになりました
ソースのダウンロード
あなたはコードを記述する予定がない場合は、次の表にGitHubに、アドレスやリンク情報に、この戦闘からソースコードをダウンロードすることができます:
名前 | リンク | リマーク |
---|---|---|
プロジェクトホーム | https://github.com/zq2599/blog_demos | GitHubの上のプロジェクトのホーム・ページ |
gitリポジトリのアドレス(HTTPS) | https://github.com/zq2599/blog_demos.git | プロジェクトのソースコードリポジトリアドレス、httpsプロトコル |
gitリポジトリのアドレス(SSH) | [email protected]:zq2599 / blog_demos.git | プロジェクトのソースコードリポジトリアドレス、sshプロトコル |
gitのプロジェクトは複数のフォルダ、春・クラウドK8S-説明責任でアカウント・サービスのソース章持つサービス春-クラウドK8S-WEB-下のフォルダ、Webサービスソースのサービス以下に示すように、フォルダ図赤いボックス:
以下は、符号化の詳細なプロセスです。
アカウント・サービス・サービスの開発と展開
アカウント-Serviceサービスは非常に一般的なspringbootアプリケーション、およびを行うには、スプリング・クラウドkubernetesの何物でも:
- Mavenのでspringbootアプリケーションを作成し、たartifactIdがあるアカウント・サービス次のように、のpom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bolingcavalry</groupId>
<artifactId>account-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>account-service</name>
<description>Demo project for Spring Cloud service provider run in kubernetes</description>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.1.RELEASE</spring-boot.version>
<maven-checkstyle-plugin.failsOnError>false</maven-checkstyle-plugin.failsOnError>
<maven-checkstyle-plugin.failsOnViolation>false</maven-checkstyle-plugin.failsOnViolation>
<maven-checkstyle-plugin.includeTestSourceDirectory>false</maven-checkstyle-plugin.includeTestSourceDirectory>
<maven-compiler-plugin.version>3.5</maven-compiler-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<maven-failsafe-plugin.version>2.18.1</maven-failsafe-plugin.version>
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
<fabric8.maven.plugin.version>3.5.37</fabric8.maven.plugin.version>
<springcloud.version>2.1.1.RELEASE</springcloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<type>pom</type>
<scope>import</scope>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springcloud.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!--skip deploy -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipTests>true</skipTests>
<!-- Workaround for https://issues.apache.org/jira/browse/SUREFIRE-1588 -->
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>fabric8-maven-plugin</artifactId>
<version>${fabric8.maven.plugin.version}</version>
<executions>
<execution>
<id>fmp</id>
<goals>
<goal>resource</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>kubernetes</id>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>fabric8-maven-plugin</artifactId>
<version>${fabric8.maven.plugin.version}</version>
<executions>
<execution>
<id>fmp</id>
<goals>
<goal>resource</goal>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<enricher>
<config>
<fmp-service>
<type>NodePort</type>
</fmp-service>
</config>
</enricher>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
唯一の違いはfabric8-のmaven-pluginのプラグインを使用することで、あなたは簡単にできるアカウント・サービス・アプリケーションは、単純なWebアプリケーションであり、そしてSpringCloud、春・クラウドkubernetesはどんな関係を持っていない、上記の内容から見て、他のspringbootするのpom.xmlアプリケーションはkubernetes環境にデプロイされます。
- application.ymlは、以下のまだ非常に簡単です:
spring:
application:
name: account-service
server:
port: 8080
- AccountController外部サービスプロバイダ、現在のコンテナのホスト名を返すのgetNameメソッドがあり、衛生対応のための方法は、二つのプローブ、呼び出し側のサイドリボンやサービスへの応答をribbonPingための方法をkubernetes、彼らは現在のサービスを決定するために、このインターフェイスを呼び出します。これは正常です。
@RestController
public class AccountController {
private static final Logger LOG = LoggerFactory.getLogger(AccountController.class);
private final String hostName = System.getenv("HOSTNAME");
/**
* 探针检查响应类
* @return
*/
@RequestMapping("/health")
public String health() {
return "OK";
}
@RequestMapping("/")
public String ribbonPing(){
LOG.info("ribbonPing of {}", hostName);
return hostName;
}
/**
* 返回hostname
* @return 当前应用所在容器的hostname.
*/
@RequestMapping("/name")
public String getName() {
return this.hostName
+ ", "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}
- minikubeマシン上のような作品の源は、kubernetesにコンパイルして展開することができ、プロジェクトをビルドし、正しく設定してくださいMavenを行い、その後、pom.xmlファイルディレクトリで次のコマンドを実行します。
mvn clean install fabric8:deploy -Dfabric8.generator.from=fabric8/java-jboss-openjdk8-jdk -Pkubernetes
次のようにコンソール出力の実装を成功した後です。
...
[INFO] Installing /usr/local/work/k8s/ribbon/spring-cloud-k8s-account-service/target/classes/META-INF/fabric8/kubernetes.json to /root/.m2/repository/com/bolingcavalry/account-service/0.0.1-SNAPSHOT/account-service-0.0.1-SNAPSHOT-kubernetes.json
[INFO]
[INFO] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ account-service <<<
[INFO]
[INFO]
[INFO] --- fabric8-maven-plugin:3.5.37:deploy (default-cli) @ account-service ---
[INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/k8s/ribbon/spring-cloud-k8s-account-service/target/classes/META-INF/fabric8/kubernetes.yml
[INFO] Using namespace: default
[INFO] Updating a Service from kubernetes.yml
[INFO] Updated Service: target/fabric8/applyJson/default/service-account-service.json
[INFO] Using namespace: default
[INFO] Updating Deployment from kubernetes.yml
[INFO] Updated Deployment: target/fabric8/applyJson/default/deployment-account-service.json
[INFO] F8: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.941 s
[INFO] Finished at: 2019-06-16T19:00:51+08:00
[INFO] ------------------------------------------------------------------------
- チェックkubernetesの展開とサービスは正常です。
[root@minikube spring-cloud-k8s-account-service]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
account-service 1/1 1 1 69m
[root@minikube spring-cloud-k8s-account-service]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
account-service NodePort 10.105.157.201 <none> 8080:32596/TCP 69m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
- serviceコマンドは、アドレス指定されたサービスへのアクセスを得ることができminikube:
[root@minikube spring-cloud-k8s-account-service]# minikube service account-service --url
http://192.168.121.133:32596
可視アカウントサービスサービスは、次のURLを介してアクセスすることができます:http://192.168.121.133:32596
ます。http://192.168.121.133:アドレスにアクセスするためのブラウザで32596 /名前を 、 以下に示すように、サービスアカウントサービス提供にアクセスすることができます。
今すぐアカウントサービスサービスは、Webサービスの開発と展開が続き、所定の位置にありますアプリケーション。Webサービス・サービスの開発と展開
Webサービスは、サービスspringbootアプリケーションが登録見つけやすスプリング・クラウドkubernetesは、指定されたポーリングサービスのすべてのポッドへのアクセスを提供し使用しています次のとおりです。- Mavenのでspringbootアプリケーションを作成し、たartifactIdがあるWebサービスは以下のように集中するために、のpom.xmlで春-クラウドスタータkubernetes-リボン依存:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bolingcavalry</groupId>
<artifactId>web-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web-service</name>
<description>Demo project for Spring Cloud service consumer run in kubernetes</description>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.1.RELEASE</spring-boot.version>
<maven-checkstyle-plugin.failsOnError>false</maven-checkstyle-plugin.failsOnError>
<maven-checkstyle-plugin.failsOnViolation>false</maven-checkstyle-plugin.failsOnViolation>
<maven-checkstyle-plugin.includeTestSourceDirectory>false</maven-checkstyle-plugin.includeTestSourceDirectory>
<maven-compiler-plugin.version>3.5</maven-compiler-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<maven-failsafe-plugin.version>2.18.1</maven-failsafe-plugin.version>
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
<fabric8.maven.plugin.version>3.5.37</fabric8.maven.plugin.version>
<springcloud.kubernetes.version>1.0.1.RELEASE</springcloud.kubernetes.version>
<springcloud.version>2.1.1.RELEASE</springcloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<type>pom</type>
<scope>import</scope>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-core</artifactId>
<version>${springcloud.kubernetes.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-discovery</artifactId>
<version>${springcloud.kubernetes.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
<version>${springcloud.kubernetes.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>${springcloud.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!--skip deploy -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipTests>true</skipTests>
<!-- Workaround for https://issues.apache.org/jira/browse/SUREFIRE-1588 -->
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>fabric8-maven-plugin</artifactId>
<version>${fabric8.maven.plugin.version}</version>
<executions>
<execution>
<id>fmp</id>
<goals>
<goal>resource</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>kubernetes</id>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>fabric8-maven-plugin</artifactId>
<version>${fabric8.maven.plugin.version}</version>
<executions>
<execution>
<id>fmp</id>
<goals>
<goal>resource</goal>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<enricher>
<config>
<fmp-service>
<type>NodePort</type>
</fmp-service>
</config>
</enricher>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
- 定着構成を増やす、次のようにapplication.ymlを読み取ります。
spring:
application:
name: web-service
server:
port: 8080
backend:
ribbon:
eureka:
enabled: false
client:
enabled: true
ServerListRefreshInterval: 5000
hystrix.command.BackendCall.execution.isolation.thread.timeoutInMilliseconds: 5000
hystrix.threadpool.BackendCallThread.coreSize: 5
- コンフィギュレーション・クラスRibbonConfigurationにリボンを作成します。
package com.bolingcavalry.webservice;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AvailabilityFilteringRule;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PingUrl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
/**
* @Description: ribbon配置类
* @author: willzhao E-mail: [email protected]
* @date: 2019/6/16 11:52
*/
public class RibbonConfiguration {
@Autowired
IClientConfig ribbonClientConfig;
/**
* 检查服务是否可用的实例,
* 此地址返回的响应的返回码如果是200表示服务可用
* @param config
* @return
*/
@Bean
public IPing ribbonPing(IClientConfig config){
return new PingUrl();
}
/**
* 轮询规则
* @param config
* @return
*/
@Bean
public IRule ribbonRule(IClientConfig config){
return new AvailabilityFilteringRule();
}
}
- 開始するには、次のようにApplicationクラスは、サービスの発見、ヒューズ、リボンの設定もrestTemplteたとえば、ノートが@LoadBalanced定義ノートを増やすに注意を払います:
package com.bolingcavalry.webservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@RibbonClient(name="account-service", configuration = RibbonConfiguration.class)
public class WebServiceApplication {
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}
- HTTPインターフェイスロジックリモート呼び出しアカウントサービスは、サービスクラスAccountServiceのに入れて、サービスの名前とURLを書き留めアカウントサービス:
package com.bolingcavalry.webservice;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Description: 这里面封装了远程调用account-service提供服务的逻辑
* @author: willzhao E-mail: [email protected]
* @date: 2019/6/16 12:21
*/
@Service
public class AccountService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "getFallbackName" ,commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000") })
public String getDataFromSpringCloudK8SProvider(){
return this.restTemplate.getForObject("http://account-service/name", String.class);
}
/**
* 熔断时调用的方法
* @return
*/
private String getFallbackName() {
return "Fallback"
+ ", "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}
- 私たちはウェブからの要求を開始した後、最後に、応答WebServiceControllerクラスのWeb要求で、AccountServiceの通話サービスは、ウェブサービスは、長距離通話サービスがサービスを占めることになります。
package com.bolingcavalry.webservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description: 测试用的controller,会远程调用account-service的服务
* @author: willzhao E-mail: [email protected]
* @date: 2019/6/16 11:46
*/
@RestController
public class WebServiceController {
@Autowired
private AccountService accountService;
/**
* 探针检查响应类
* @return
*/
@RequestMapping("/health")
public String health() {
return "OK";
}
/**
* 远程调用account-service提供的服务
* @return 多次远程调返回的所有结果.
*/
@RequestMapping("/account")
public String account() {
StringBuilder sbud = new StringBuilder();
for(int i=0;i<10;i++){
sbud.append(accountService.getDataFromSpringCloudK8SProvider())
.append("<br>");
}
return sbud.toString();
}
}
- minikubeマシン上のような作品の源は、kubernetesにコンパイルして展開することができ、プロジェクトをビルドし、正しく設定してくださいMavenを行い、その後、pom.xmlファイルディレクトリで次のコマンドを実行します。
mvn clean install fabric8:deploy -Dfabric8.generator.from=fabric8/java-jboss-openjdk8-jdk -Pkubernetes
次のようにコンソール出力の実装を成功した後です。
...
[INFO] Installing /usr/local/work/k8s/ribbon/spring-cloud-k8s-web-service/target/classes/META-INF/fabric8/kubernetes.json to /root/.m2/repository/com/bolingcavalry/web-service/0.0.1-SNAPSHOT/web-service-0.0.1-SNAPSHOT-kubernetes.json
[INFO]
[INFO] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ web-service <<<
[INFO]
[INFO]
[INFO] --- fabric8-maven-plugin:3.5.37:deploy (default-cli) @ web-service ---
[INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/k8s/ribbon/spring-cloud-k8s-web-service/target/classes/META-INF/fabric8/kubernetes.yml
[INFO] Using namespace: default
[INFO] Creating a Service from kubernetes.yml namespace default name web-service
[INFO] Created Service: target/fabric8/applyJson/default/service-web-service.json
[INFO] Using namespace: default
[INFO] Creating a Deployment from kubernetes.yml namespace default name web-service
[INFO] Created Deployment: target/fabric8/applyJson/default/deployment-web-service.json
[INFO] F8: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.792 s
[INFO] Finished at: 2019-06-16T19:24:21+08:00
[INFO] ------------------------------------------------------------------------
- チェックkubernetesの展開とサービスは正常です。
[root@minikube spring-cloud-k8s-web-service]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
account-service 1/1 1 1 109m
web-service 1/1 1 1 18m
[root@minikube spring-cloud-k8s-web-service]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
account-service NodePort 10.105.157.201 <none> 8080:32596/TCP 109m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
web-service NodePort 10.99.211.179 <none> 8080:30519/TCP 18m
- serviceコマンドは、アドレス指定されたサービスへのアクセスを得ることができminikube:
[root@minikube spring-cloud-k8s-web-service]# minikube service web-service --url
http://192.168.121.133:30519
可視ウェブサービスのサービスは、次のURLを介してアクセスすることができます:http://192.168.121.133:30519
ます。http://192.168.121.133:アドレスにアクセスするためのブラウザで30519 /アカウントを,,次に示すページの内容を表示するには、Webサービスの呼び出しするアカウント・サービス・インターフェースに戻りますが、登録機能がkubernetesで見つけ証明されていますノーマル:
拡張リボンポーリング機能を検証します
ウェブサービスのアカウントサービスのサービスは正常に呼び出すことができますが、訪問は常にポッドですが、我々は拡張のためのポッドのサービスを考慮する必要があり、ウェブサービスをポーリングすることができるかどうかを確認するために、2の数を調整しますポッドの各アカウントサービスを呼び出します:- ポッド2の数を調整するには、次のコマンドを実行します。
kubectl scale --replicas=2 deployment account-service
- ポッドのアカウントサービスの確認、2は(アカウントサービス-5554576647-m29xrとアカウントサービス-5554576647-zwwml)が発見されています:
[root@minikube spring-cloud-k8s-web-service]# kubectl get pods
NAME READY STATUS RESTARTS AGE
account-service-5554576647-m29xr 1/1 Running 0 53m
account-service-5554576647-zwwml 1/1 Running 0 20s
web-service-6d775855c7-7lkvr 1/1 Running 0 29m
ます。http://192.168.121.133:アドレスにアクセスするためのブラウザで30519 /アカウントを以下に示すように、アカウント-serciceはフロント、ホスト名が2となっている返され、ウェブサービスを示す、一貫性のある名前ポッドを見つけました確かにリボン投票によってポッド以上のアカウントサービスを訪問しました:
ヒューズを検証する機能
その後、ウェブサービスの設定サービスは力に吹き込むことができるかどうかを確認します。- 展開のアカウントサービスを削除するには、次のコマンドを実行します。
kubectl delete deployment account-service
- アドレスにアクセスするための別のブラウザます。http://192.168.121.133:次ページの30519 /アカウント、示すように、「フォールバック」はヒューズを有効にするように設定されていることを示し、返されたコンテンツの融合を設定する方法です。
- ウェブサービスのサービスの展開を再構築するWebサービスは、次のコマンドを実行する位置に戻ってのpom.xml:
mvn clean install fabric8:deploy -Dfabric8.generator.from=fabric8/java-jboss-openjdk8-jdk -Pkubernetes
- 以下に示すように、サービスが正常に復元、30519 /アカウントます:http://192.168.121.133別のブラウザでは、アドレスにアクセスします。
この時点で、春・クラウドkubernetesサービスの発見と(ヒューズを含む)のポーリング戦闘が完了すると、APIサーバーによって提供される情報の使用は、SpringCloudアプリケーションへのバネ - クラウドkubernetesオリジナルの生kubernetesサービスは、マイクロ伝統的なサービスを支援するためにあなたはkubernetesにアプリケーションを移行を検討しているならば、私は、これはあなたにいくつかの参照を与えることができることを望む、環境中のより良い統合をkubernetes。