IDE 開発ツール: IntelliJ IDEA 14.0.2
バージョン管理: Maven
テクノロジースタック: Spring Cloud
環境:JDK1.8
1.Maven プロジェクトを作成する
1. 図に示すように、ファイル—>新しいプロジェクト—>Maven を選択します。
2. モジュール名とプロジェクトのパスを入力します。
上記の手順に従って、Maven プロジェクトが簡単に作成されます。
この時点では、プロジェクトはまだ SpringBoot プロジェクトではありません。
2. サブプロジェクトの作成
同様にサブプロジェクトを作成します。グループ名は pom で宣言する必要があることに注意してください。最も単純なマイクロサービス プロジェクトの構造の 1 つは次のとおりです。このうち共通のものはエンティティ等に分けて抽出され、以降導入されたモジュールとして他のプロジェクトで利用されています。eureka-server は eureka サーバーであり、他の業務モジュールはクライアントとして登録する必要があります。system-management は、ログイン インターフェイスを実装するビジネス モジュールの例です。
3. 各モジュールのpomを設定します
1.プロジェクト全体
主にモジュールと依存関係のバージョンを管理します。
独自のプロジェクトを作成するときは、groupId を groupId に変更する必要があります
<?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>
<groupId>com.cloud</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka</module>
<module>web-server</module>
<module>common</module>
<module>system-management</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--<version>1.5.6.RELEASE</version>-->
<version>1.5.22.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<skipDockerBuild>true</skipDockerBuild>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.共通モジュール
親をプロジェクト全体の artifactId として指定する必要があります
独自のプロジェクトを作成するときは、groupId を groupId に変更する必要があります
<?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">
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
3.エウレカサーバー
アーティファクト名とグループ名が同じです
中心的な依存関係は次のとおりです
エウレカサーバー
コードのニーズに応じて他の依存関係が導入されます
<?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">
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR6</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</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-actuator</artifactId>
</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>
</project>
4. マイクロサービスモジュール
アーティファクト名とグループ名が同じです
コアの依存関係は、eureka クライアント、Feign クライアント、Springboot です。
およびパブリックモジュール
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>system-management</artifactId>
<name>system-management</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR6</spring-cloud.version>
</properties>
<dependencies>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--数据库配置-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--springboot配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--公共模块-->
<dependency>
<groupId>com.cloud</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</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>
</project>
5.ふり
中心的な依存関係は次のとおりです
Eurekaクライアント、Feignサーバー、Springboot、パブリックモジュール
<?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">
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web-server</artifactId>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR6</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.cloud</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</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>
</project>
4、ymlを設定する
1.エウレカサーバー
主な機能はポート番号を設定することです
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/ #单机就是指向自己
2. マイクロサービスモジュール
主な機能は、ポート番号、mybatis、データベースを設定することです。
server.port=8099
#server.servlet.context-path=/disk
#spring.web.resources.static-locations=classpath:/templates/, classpath:/static/
spring.application.name=system-management
# MyBatis Configuration
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.type-aliases-package=import com.cloud.pojo
# Database Configuration
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
3.ふり
ポート番号を設定するだけです
各設定ファイルの場所は以下のとおりです。
このうち、システム管理はマイクロサービスモジュール、WebサーバーはFeignです。
yml は各モジュールのリソース ディレクトリにあり、pom は各モジュールのルート ディレクトリにあります。
各依存関係と構成項目の役割を理解することが最善であり、問題が発生した場合の解決に役立ちます。
バージョンは統一的に管理するのが最適です。
5. ビジネスコードの記述
1.エウレカランチャー
package com.buba.springcloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain {
public static void main(String[] args) {
SpringApplication.run(EurekaMain.class,args);
}
}
2. マイクロサービス イネーブラー
package com.study.springcloud.systemmanagement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class SystemManagementApplication {
public static void main(String[] args) {
SpringApplication.run(SystemManagementApplication.class, args);
}
}
3. フェイグランチャー
package com.cloud;
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;
//@ComponentScan(basePackages = {"com.study.springcloud.feign"})
//@EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
//@EnableFeignClients(basePackages = "com.cloud.client")
//@EnableFeignClients(basePackages = {"com.cloud"})
public class WebServerApplication {
public static void main(String[] args) {
SpringApplication.run(WebServerApplication.class, args);
}
}
4. 公開授業
package com.cloud.pojo;
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(String username, String password){
this.username=username;
this.password=password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
5.ふり
5.1偽クライアント
package com.cloud.client;
import com.cloud.pojo.User;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name="system-management",url = "http://localhost:8099")
public interface LoginClient {
@RequestMapping(value = "/login",method = RequestMethod.GET)
boolean Login(@RequestParam("username") String username, @RequestParam("password") String password);
}
5.2 コントローラー
package com.cloud.controller;
import com.cloud.pojo.User;
import com.cloud.client.LoginClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/webs")
public class LoginController {
@Autowired
private LoginClient loginClient;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String Login(HttpServletRequest request){
//System.out.println("ok");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("请求中username=:"+username);
User user=new User(username,password);
System.out.println("读取请求参数构造的user对象:"+user);
System.out.println("读取请求参数构造的user对象的username:"+user.getUsername());
if(loginClient.Login(user.getUsername(),user.getPassword())){
return "success";
}
return "failed";
}
}
6. マイクロサービス
6.1コントローラー
package com.study.springcloud.systemmanagement.controller;
import com.cloud.pojo.User;
import com.study.springcloud.systemmanagement.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping
public class LoginController {
@Autowired
private LoginService loginService;
//@RequestMapping(value = "/login", method = RequestMethod.GET)
@RequestMapping(value = "/login",method = RequestMethod.GET)
@ResponseBody
public boolean login(String username,String password) {
// System.out.println("传给微服务的user:"+user);
// System.out.println("传给微服务的user的username:"+user.getUsername());
System.out.println("传给微服务的username:"+username);
User user_result = this.loginService.login(username, password);
//System.out.println(user_result);
return user_result != null;
}
}
6.2サービス
package com.study.springcloud.systemmanagement.service;
import com.cloud.pojo.User;
public interface LoginService {
User login(String username, String password);
}
6.3サービスのインスタンス化
package com.study.springcloud.systemmanagement.controller;
import com.cloud.pojo.User;
import com.study.springcloud.systemmanagement.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping
public class LoginController {
@Autowired
private LoginService loginService;
//@RequestMapping(value = "/login", method = RequestMethod.GET)
@RequestMapping(value = "/login",method = RequestMethod.GET)
@ResponseBody
public boolean login(String username,String password) {
// System.out.println("传给微服务的user:"+user);
// System.out.println("传给微服务的user的username:"+user.getUsername());
System.out.println("传给微服务的username:"+username);
User user_result = this.loginService.login(username, password);
//System.out.println(user_result);
return user_result != null;
}
}
6.4 ダオ
package com.study.springcloud.systemmanagement.dao;
import com.cloud.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserDao {
User login(@Param("username") String username, @Param("password") String password);
}
6.5 マッパー.XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.springcloud.systemmanagement.dao.UserDao">
<resultMap id="userMap" type="User">
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
<select id="login" resultMap="userMap">
select username,password
from user
where username =#{username} and password =#{password}
</select>
</mapper>
6. postmanを利用したプロジェクトの運用と検証
3 つのサービスはすべて開始できます
郵便配達員によるテスト
コンソールに表示される情報も正常です
7. まとめ
springboot、springcloud のアーキテクチャ、各コンポーネントの機能を事前に理解し、共通の依存関係を理解した上でビルドを試みるのが最善です。
以下は著者の個人的な理解ですので、訂正をお願いします。
ビルドするときは、各構成ファイルのパラメーターを独自のものに変更することに注意してください。
エラーを回避するには、管理ツールの統合バージョンを使用することが最善です。
我慢してください、最初は難しいです。
著者は構築中に多くの間違いに遭遇しましたが、それらは段階的に解決されました。
たとえば、mapper.xml 構成の dao パスが間違っています (エラーは報告されませんが、見つけるのは困難です)。
バージョンに互換性がないため、EnableFeignClients アノテーションは FeignClient をスキャンできません。プロジェクトは、プロジェクト全体のリファクタリングと各モジュールの統合バージョンの後にのみ解決できます (Springboot および Springcloud コンポーネントにも互換性の問題があります)。
Feign がパラメーターをマイクロサービスに渡すとき、FeignClient のメソッド パラメーターがデフォルトであり、基礎となる原理がまだ不明であるため、値を渡すことはできません。