マイクロサービス実戦の春雲と刀客(三)-インタフェース向け呼び出しコード構造の例


概要
前編では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サーバ上ですべてのマイクロサービスで使用すればいいです).
  • 
    <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
  • 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以上かもしれません)にします.このようにしてこそ、インタフェースと論理の分離の効果を実現することができます.
  • 
    <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>
  • インタフェースクラスを定義します.インタフェースにはget()メソッドが1つしかありません.アクセスすると固定文字列が返されます.
  • 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();
    
    
    }
  • はmain()メソッドを含むクラスを追加し続ける必要があります.これは任意に定義できます.コンパイル時にspring bootはmain()メソッドを探しますが、なければコンパイルが間違っています.
  • package com.cehome.cloud.demo.api;
    
    public class DemoAPI {
    
        public static void main(String[] args) {
    
        }
    }
    

    サービスモジュールdemo-service
  • pomを定義する.xml.spring-cloud-starter-eureka、spring-boot-starter-web、spring-cloud-starter-feignという基本的なマイクロサービス依存に加えて、上記で定義したインタフェース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-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>
    
  • プロファイルアプリケーションを定義する.properties. spring.application.nameはサービスIdであり,上@Feign注記の名前と同じである.
  • eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
    server.port = 8762
    spring.application.name = demo-service
  • mainメソッドを実装します.@EnableEurekaClientはサービスをeureka登録センターに関連付け、サービスプロバイダとしても消費者としてもよい.
  • 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);
        }
    }
    
  • Demo 1 Serviceインタフェースを継承し、サービスDemo 1 ServiceImplを実現します.ここのサービスは実際にはControllerであり、apiで定義されたインタフェースDemo 1 Serviceを継承するように規範化され、管理が容易であることに注意してください.また、Demo 1 ServiceImplのパッケージ名もサービスで、controllerを使わないという約束であり、サービスであることを強調しています.
  • 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";
        }
    }
    
  • 検証.アクセスhttp://localhost:8762/demo1/get

  • クライアントコール
  • 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">
    
    
        <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>
  • application.properties
  • eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
    server.port = 8763
    spring.application.name = client-demo
  • spring bootメインプログラム.@EnableDiscoveryClient-消費者(クライアント)としてのみ使用され、消費者として同時にサービスプロバイダとして使用される場合は@EnableEurekaClientを使用します.EnableFeignClients-Feignスキャンapiインタフェースの範囲を指定します.Feignは@Feign注記を含むinterfaceにスキャンされ、springエージェントbeanがインスタンス化され、様々なメソッドが呼び出され、URL送信要求に変換されます.
  • 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);
    
        }
    }
  • は、サービスを呼び出す.見えますpom.xmlでdemo-apiを導入した後、"@Autowired private Demo 1 Service demo 1 Service;"方式は、ローカルbeanを呼び出すようにマイクロサービスを呼び出す.ユーザーはapi jarパッケージを導入すればいいだけで、サービスがどのマシンに配備されているのか気にしなくても、careがどのようにURLをつなぎ合わせてサービスを呼び出すのか気にしなくても、javaのオブジェクト向け開発の要求に合っているのではないでしょうか.
  • 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();
        }
    
    }