マイクロサービス実戦の春雲と刀客(三)-インタフェース向け呼び出しコード構造の例
37477 ワード
概要
前編ではspring cloudのインタフェース呼び出し向けの開発スタイルについて述べたが,この編ではコード構造全体を簡単だが完全な例を挙げて説明する.コードがアップロードされましたhttps://github.com/maruixiang/spring-cloud-demo/tree/master/demo1
コード構造
コード全体はdemo 1ディレクトリの下にあり、ルートレベルのparent pomファイルと3つのmavenアプリケーションが含まれています.-ルートpomファイル:すべてのアプリケーションのparent pomファイル.-eureka:サービス登録と発見のための登録センター.-demo:demoマイクロサービス、それ自体は2つのモジュールを含んで、demo-apiは第三者に使用するインタフェースを提供します;demo-serviceはサービスの具体的な実現である.なぜマイクロサービスごとにディレクトリ構造が追加されたのでしょうか.マイクロサービスの職責区分から言えば、異なるチームが異なるマイクロサービスの開発を担当しているため、各マイクロサービスは独立してプロジェクトになり、コードはいつでも分離され、混在しないことができます.-Client:クライアント呼び出しサービス.各アプリケーションmavenコード構造はhttp://start.spring.io/、IDEツール、または手動で生成されます.ここでは説明しません.
統一されたルートレベルのpom.xmlこのファイルは手動で作成され、spring bootの基本情報を統一的にここに移動して定義します.spring-boot 1.5.7.RELEASE spring-cloud Dalston.SR3 . テストを容易にするために、3つのアプリケーションのmodules定義もここに入れました.実際のプロジェクト開発では、このファイルにはmodulesが含まれるべきではありません(実際の開発では、基本的に変更されない共通pomファイルであり、新しく追加されたマイクロサービスは不可能です.正しい方法はmodulesを削除し、パブリケーションノードdistributionManagement情報に参加し、このpomをmvn deployを通じてmavenサーバ上ですべてのマイクロサービスで使用すればいいです).
eureka登録センター
読み方[ju:`rika:]
pomの定義
spring-cloud-parentを継承し、spring-cloud-starter-eureka-serverに依存すればよい
スプリング構成の追加
tomcatポートeurekaで約束した8761を使用
クラスの開始
開始
mainメソッドを実行し、アクセスhttp://localhost:8761/
demoマイクロサービスの開発
demo自体は、2つのモジュールを含むmavenアプリケーションであり、1つはapiがサードパーティに呼び出され、1つは具体的な論理である.
インタフェースモジュールdemo-api Feignが必要なのでFeign依存を導入すればよい.pomファイルにはspring-boot-thin-layoutの重要なmavenプラグインも導入されます.spring bootはデフォルトでfat jar(60 m程度)にコンパイルされていますが、apiはjarパッケージとして第三者に使用されるので、spring boot構造のfat jarにすると第三者が使用できなくなるに違いありません.このmavenプラグインを導入すると、apiを一般的に使用しているjarパッケージ(10 K以上かもしれません)にします.このようにしてこそ、インタフェースと論理の分離の効果を実現することができます. インタフェースクラスを定義します.インタフェースにはget()メソッドが1つしかありません.アクセスすると固定文字列が返されます. はmain()メソッドを含むクラスを追加し続ける必要があります.これは任意に定義できます.コンパイル時にspring bootはmain()メソッドを探しますが、なければコンパイルが間違っています.
サービスモジュールdemo-service pomを定義する.xml.spring-cloud-starter-eureka、spring-boot-starter-web、spring-cloud-starter-feignという基本的なマイクロサービス依存に加えて、上記で定義したインタフェースdemo-apiにも依存します. プロファイルアプリケーションを定義する.properties. spring.application.nameはサービスIdであり,上@Feign注記の名前と同じである. mainメソッドを実装します.@EnableEurekaClientはサービスをeureka登録センターに関連付け、サービスプロバイダとしても消費者としてもよい. Demo 1 Serviceインタフェースを継承し、サービスDemo 1 ServiceImplを実現します.ここのサービスは実際にはControllerであり、apiで定義されたインタフェースDemo 1 Serviceを継承するように規範化され、管理が容易であることに注意してください.また、Demo 1 ServiceImplのパッケージ名もサービスで、controllerを使わないという約束であり、サービスであることを強調しています. 検証.アクセスhttp://localhost:8762/demo1/get
クライアントコール pom.xml application.properties spring bootメインプログラム.@EnableDiscoveryClient-消費者(クライアント)としてのみ使用され、消費者として同時にサービスプロバイダとして使用される場合は@EnableEurekaClientを使用します.EnableFeignClients-Feignスキャンapiインタフェースの範囲を指定します.Feignは@Feign注記を含むinterfaceにスキャンされ、springエージェントbeanがインスタンス化され、様々なメソッドが呼び出され、URL送信要求に変換されます. は、サービスを呼び出す.見えますpom.xmlでdemo-apiを導入した後、"@Autowired private Demo 1 Service demo 1 Service;"方式は、ローカルbeanを呼び出すようにマイクロサービスを呼び出す.ユーザーはapi jarパッケージを導入すればいいだけで、サービスがどのマシンに配備されているのか気にしなくても、careがどのようにURLをつなぎ合わせてサービスを呼び出すのか気にしなくても、javaのオブジェクト向け開発の要求に合っているのではないでしょうか.
前編ではspring cloudのインタフェース呼び出し向けの開発スタイルについて述べたが,この編ではコード構造全体を簡単だが完全な例を挙げて説明する.コードがアップロードされましたhttps://github.com/maruixiang/spring-cloud-demo/tree/master/demo1
コード構造
コード全体はdemo 1ディレクトリの下にあり、ルートレベルのparent pomファイルと3つのmavenアプリケーションが含まれています.-ルートpomファイル:すべてのアプリケーションのparent pomファイル.-eureka:サービス登録と発見のための登録センター.-demo:demoマイクロサービス、それ自体は2つのモジュールを含んで、demo-apiは第三者に使用するインタフェースを提供します;demo-serviceはサービスの具体的な実現である.なぜマイクロサービスごとにディレクトリ構造が追加されたのでしょうか.マイクロサービスの職責区分から言えば、異なるチームが異なるマイクロサービスの開発を担当しているため、各マイクロサービスは独立してプロジェクトになり、コードはいつでも分離され、混在しないことができます.-Client:クライアント呼び出しサービス.各アプリケーションmavenコード構造はhttp://start.spring.io/、IDEツール、または手動で生成されます.ここでは説明しません.
統一されたルートレベルのpom.xml
<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.0modelVersion>
<groupId>com.cehome.cloudgroupId>
<artifactId>cehome-cloud-parentartifactId>
<version>1.0.0-SNAPSHOTversion>
<packaging>pompackaging>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.7.RELEASEversion>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>1.5.7.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Dalston.SR3version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<finalName>${project.artifactId}finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
<modules>
<module>eurekamodule>
<module>demomodule>
<module>clientmodule>
modules>
project>
eureka登録センター
読み方[ju:`rika:]
pomの定義
spring-cloud-parentを継承し、spring-cloud-starter-eureka-serverに依存すればよい
<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.0modelVersion>
<parent>
<groupId>com.cehome.cloudgroupId>
<artifactId>spring-cloud-parentartifactId>
<version>1.0.0-SNAPSHOTversion>
<relativePath>../pom.xmlrelativePath>
parent>
<groupId>com.cehome.cloudgroupId>
<artifactId>eurekaartifactId>
<version>1.0.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>eurekaname>
<description>Demo project for Spring Bootdescription>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eureka-serverartifactId>
dependency>
dependencies>
project>
スプリング構成の追加
tomcatポートeurekaで約束した8761を使用
server.port=8761
spring.application.name=eureka
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
# client? 。 true , , :Cannot execute request on any known server
eureka.client.fetch-registry=false
# false, true eureka
eureka.client.eureka-with-eureka=false
クラスの開始
package com.cehome.cloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
開始
mainメソッドを実行し、アクセスhttp://localhost:8761/
demoマイクロサービスの開発
demo自体は、2つのモジュールを含むmavenアプリケーションであり、1つはapiがサードパーティに呼び出され、1つは具体的な論理である.
インタフェースモジュールdemo-api
<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.0modelVersion>
<groupId>com.cehome.cloudgroupId>
<artifactId>demo-apiartifactId>
<version>1.0.0-SNAPSHOTversion>
<packaging>jarpackaging>
<parent>
<groupId>com.cehome.cloudgroupId>
<artifactId>demo-parentartifactId>
<version>1.0.0-SNAPSHOTversion>
<relativePath>../pom.xmlrelativePath>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
<scope>providedscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimentalgroupId>
<artifactId>spring-boot-thin-layoutartifactId>
<version>1.0.5.RELEASEversion>
dependency>
dependencies>
plugin>
plugins>
build>
project>
package com.cehome.cloud.demo.api;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name= "demo-service" )
public interface Demo1Service {
@RequestMapping("/demo1/get")
String get();
}
package com.cehome.cloud.demo.api;
public class DemoAPI {
public static void main(String[] args) {
}
}
サービスモジュールdemo-service
<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.0modelVersion>
<groupId>com.cehome.cloudgroupId>
<artifactId>demo-serviceartifactId>
<version>1.0.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>demo-servicename>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>com.cehome.cloudgroupId>
<artifactId>demo-parentartifactId>
<version>1.0.0-SNAPSHOTversion>
<relativePath>../pom.xmlrelativePath>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
dependency>
<dependency>
<groupId>com.cehome.cloudgroupId>
<artifactId>demo-apiartifactId>
<version>1.0.0-SNAPSHOTversion>
dependency>
dependencies>
project>
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
server.port = 8762
spring.application.name = demo-service
package com.cehome.cloud.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
//-- provider and consumer service
@EnableEurekaClient
@ComponentScan("com.cehome.cloud.demo")
public class DemoServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DemoServiceApplication.class);
}
}
package com.cehome.cloud.demo.service;
import com.cehome.cloud.demo.api.Demo1Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Demo1ServiceImpl implements Demo1Service {
@Override
public String get() {
return "This is Demo1 Service";
}
}
クライアントコール
<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">
<parent>
<groupId>com.cehome.cloudgroupId>
<artifactId>spring-cloud-parentartifactId>
<version>1.0.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<groupId>com.cehome.cloudgroupId>
<artifactId>clientartifactId>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
dependency>
<dependency>
<groupId>com.cehome.cloudgroupId>
<artifactId>demo-apiartifactId>
<version>1.0.0-SNAPSHOTversion>
dependency>
dependencies>
project>
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
server.port = 8763
spring.application.name = client-demo
package com.cehome.cloud.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
//-- consumer http://blog.didispace.com/spring-cloud-tips-feign-rpc/
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.cehome.cloud"})
@RestController
@ComponentScan("com.cehome.cloud.client")
public class ClientApplication {
public static void main(String[] args) {
SpringApplication springApplication=new SpringApplication(ClientApplication.class);
ConfigurableApplicationContext applicationContext=springApplication.run(args);
}
}
package com.cehome.cloud.client.controller;
import com.cehome.cloud.demo.api.Demo1Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo1")
public class Demo1Controller {
private static final Logger logger = LoggerFactory.getLogger(Demo1Controller.class);
@Autowired
private Demo1Service demo1Service;
@GetMapping("/get")
public String get() {
logger.info("begin to get ......");
return demo1Service.get();
}
}