1、建立父工程
? 首先創(chuàng)建一個父工程,名字為spring cloud打開IDEA(以下編碼過程編碼工具采用IDEA)。
創(chuàng)建新工程為Spring Cloud。

? 選擇下一步



引入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>
<groupId>cn.org.july.springcloud</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.version>1.0-SNAPSHOT</project.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<lombok.version>1.16.18</lombok.version>
<log4j.version>1.2.17</log4j.version>
<junit.version>4.12</junit.version>
<mysql.version>6.0.6</mysql.version>
<druid.version>1.1.10</druid.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql jdbc 驅(qū)動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>default-site</id>
<phase>site</phase>
<goals>
<goal>site</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
? 該工程為父工程,打包方式為pom.<packaging>pom</packaging>
2、建立服務(wù)API模塊
? 在父工程中,新建Module,module名稱為springcloud-api

?

? 創(chuàng)建完成后項目結(jié)構(gòu)如下:

? 新建包cn.org.july.springcloud.api.entities
? 新建類User內(nèi)容如下:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User implements Serializable {
/**
* 主鍵
*/
private Integer id;
/**
* 部門名稱
*/
private String userName;
/**
* 存儲數(shù)據(jù)庫位置(分布式部署可能存在多個數(shù)據(jù)庫)
*/
private String dbSource;
/**
* 電話號
*/
private Spring phone;
/**
* 郵箱
*/
private String email;
/**
* 密碼
*/
private String pwd;
}
說明:此次使用lombok插件;官網(wǎng) https://www.projectlombok.org/
| 注解 | 說明 |
|---|---|
| @Data | 在JavaBean或類JavaBean中使用,這個注解包含范圍最廣,它包含getter、setter、NoArgsConstructor注解,即當使用當前注解時,會自動生成包含的所有方法; |
| @getter | 在JavaBean或類JavaBean中使用,使用此注解會生成對應的getter方法; |
| @setter | 在JavaBean或類JavaBean中使用,使用此注解會生成對應的setter方法; |
| @NoArgsConstructor | 在JavaBean或類JavaBean中使用,使用此注解會生成對應的無參構(gòu)造方法; |
| @AllArgsConstructor | 在JavaBean或類JavaBean中使用,使用此注解會生成對應的有參構(gòu)造方法; |
| @ToString | 在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的toStirng方法; |
| @EqualsAndHashCode | 在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的equals方法和hashCode方法; |
| @Slf4j | 在需要打印日志的類中使用,當項目中使用了slf4j打印日志框架時使用該注解,會簡化日志的打印流程,只需調(diào)用info方法即可; |
| @Log4j | 在需要打印日志的類中使用,當項目中使用了log4j打印日志框架時使用該注解,會簡化日志的打印流程,只需調(diào)用info方法即可; |
| @Accessors(prefix = {"first"}, fluent = true, chain = false) | 與生存的get和set方法有關(guān),prefix與定義屬性前綴相同時且接下來的字符大寫才生效,可以看源碼注釋或自行嘗試; fluent是決定生成的get/set方法要不要set/get前綴,chain決定set方法是void類型還是返回this |
項目POM文件內(nèi)容如下:
<?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>cn.org.july.springcloud</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>springcloud-api</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
</project>
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User implements Serializable {
/**
* 主鍵
*/
private Integer id;
/**
* 部門名稱
*/
private String userName;
/**
* 存儲數(shù)據(jù)庫位置(分布式部署可能存在多個數(shù)據(jù)庫)
*/
private String dbSource;
/**
* 電話號
*/
private Spring phone;
/**
* 郵箱
*/
private String email;
/**
* 密碼
*/
private String pwd;
}
3、建立服務(wù)提供者
? 在父工程中,新建Module,module名稱為springcloud-provider-user-8001。
? 創(chuàng)建過程如上,不再截圖。
修改該Module pom.xml文件,內(nèi)容如下:
<?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>springcloud</artifactId>
<groupId>cn.org.july.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-user-8001</artifactId>
<dependencies>
<!-- 引入API -->
<dependency>
<groupId>cn.org.july.springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 數(shù)據(jù)源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- 數(shù)據(jù)庫驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- springBoot 集成 mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- web模塊 -->
<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>
</dependency>
</dependencies>
</project>
我們這里主要是講整體架構(gòu)搭建,我們不具體實現(xiàn)復雜的業(yè)務(wù)邏輯。以下只實現(xiàn)查詢接口。
在新建的Module中建立如下項目結(jié)構(gòu):

新建包路徑
cn.org.july.springcloud.dao;cn.org.july.springcloud.service;cn.org.july.springcloud.controller;。-
在
resources目錄下創(chuàng)建application.yml配置文件。xserver: port: 8001 mybatis: type-aliases-package: cn.org.july.springcloudapi.entities #所以entity別名類所在路徑 spring: application: name: springcloud-user datasource: type: com.alibaba.druid.pool.DruidDataSource #當前數(shù)據(jù)源操作類型 driver-class-name: com.mysql.cj.jdbc.Driver #mysql驅(qū)動包 url: jdbc:mysql://127.0.0.1:3306/cloudDB01 #數(shù)據(jù)庫連接 username: root password: xxxx dbcp2: min-idle: 5 #數(shù)據(jù)庫連接池的最小維持連接數(shù) initial-size: 5 #初始化連接數(shù) max-total: 5 #最大連接數(shù) max-wait-millis: 200 #等待連接獲取的最大超時時間注意:
spring: application: name: springcloud-user -
新建數(shù)據(jù)庫cloudDB01執(zhí)行以下腳本
/* Navicat MySQL Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50719 Source Host : localhost Source Database : cloudDB01 Target Server Type : MySQL Target Server Version : 50719 File Encoding : utf-8 Date: 11/18/2018 14:19:42 PM */ SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `dbSource` varchar(50) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `pwd` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of `user_copy` -- ---------------------------- BEGIN; INSERT INTO `user` VALUES ('1', 'JULY', 'cloudDB01', '18232533234', 'july@163.com', '123456'), ('2', 'WHJ', 'cloudDB01', '12312312312', '123@qq.com', '123456'); COMMIT; SET FOREIGN_KEY_CHECKS = 1; -
在dao中新建類:
UserDao.內(nèi)容如下:@Mapper public interface UserDao { @Select("select * from user") List<User> findAll(); @Select("select * from user where id = #{id}") User findById(Long id); } -
在service中新建類:
UserService。內(nèi)容如下:@Service public class UserService { @Autowired private UserDao userDao; public User findById(Long id) { return userDao.findById(id); } public List<User> findAll() { return userDao.findAll(); } } -
在controller中新建類:
UserController。內(nèi)容如下:@RestController @RequestMapping public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/user/all") @ResponseBody public List<User> getAllUser(){ return userService.findAll(); } @RequestMapping(value = "/user/{id}") @ResponseBody public User getUserById(@PathVariable("id") Long id){ return userService.findById(id); } } -
創(chuàng)建服務(wù)啟動類
Application_provider_8001。內(nèi)容如下:@SpringBootApplication @MapperScan(basePackages = "cn.org.july.springcloud") public class Application_provider_8001 { public static void main(String[] args) { SpringApplication.run(Application_provider_8001.class, args); } } 啟動后在瀏覽器中輸入http://localhost:8001/user/all;返回內(nèi)容如下,說明服務(wù)提供者搭建成功。

4、創(chuàng)建服務(wù)消費者
? 新建Module,名稱為springcloud-consumer-user-8000。
創(chuàng)建過來不在詳細講述;創(chuàng)建完成后,項目結(jié)構(gòu)目錄如下:
[圖片上傳失敗...(image-f5e239-1546251342956)]
在
springcloud-consumer-user-8000中,新建包結(jié)構(gòu),cn.org.july.springcloud.cfgbean;cn.org.july.springcloud.controller.-
在
resources目錄新建application.yml配置文件server: port: 8000作為服務(wù)消費者,只需要指定服務(wù)端口即可。
-
在
cn.org.july.springcloud.cfgbean包創(chuàng)建ConfigBean.內(nèi)容如下:@Configuration public class ConfigBean { @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }關(guān)于這兩個注解,筆者在Spring Boot 中已經(jīng)詳細講解過,有想了解,提供傳送門;https://blog.csdn.net/July_whj/article/details/83449911
RestTemplate: RestTemplate 提供了多種便捷訪問遠程HTTP服務(wù)的方法,是一種簡單便捷的訪問restful服務(wù)模版類,是Spring提供的用于訪問Rest服務(wù)的客戶端模版工具集。詳情查看官方網(wǎng)站 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
-
在
controller中新建UserController_Consumer類。(這里命名有點怪。。。)@RestController public class UserController_Consumer { /** * 服務(wù)提供方地址 */ private static final String url = "http://localhost:8001/"; /** * RestTemplate 提供了多種便捷訪問遠程HTTP服務(wù)的方法 * 是一種簡單便捷的訪問restful服務(wù)模版類,是Spring提供的用于訪問 * Rest服務(wù)的客戶端模版工具集 */ @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/consumer/user/all") @ResponseBody public List getUserAll() { return restTemplate.getForObject(url.concat("user/all"), List.class); } @RequestMapping(value = "/consumer/user/{id}") @ResponseBody public ResponseEntity<User> getUserById(@PathVariable("id") Long id) { return restTemplate.getForEntity(url.concat("user/").concat(id.toString()), User.class); } }這里和服務(wù)提供者的區(qū)別訪問地址新增
consumer路徑。 -
創(chuàng)建服務(wù)啟動類
Application_consumer_8000,內(nèi)容如下:@SpringBootApplication public class Application_consumer_8000 { public static void main(String[] args) { SpringApplication.run(Application_consumer_8000.class, args); } } 首先啟動服務(wù)提供者服務(wù)
springcloud-provider-user-8001,在啟動服務(wù)消費者springcloud-consumer-user-8000.服務(wù)啟動成功后訪問 http://localhost:8000/consumer/user/1;http://localhost:8000/consumer/user/all


出現(xiàn)以上結(jié)果,服務(wù)消費者配置成功。該程序只做簡單實例。