Spring Cloud --- (一) 項目搭建

1、建立父工程

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

創(chuàng)建新工程為Spring Cloud。

QQ20181114-231422.png

? 選擇下一步


QQ20181114-231655.png
QQ20181114-231747.png
QQ20181114-231821.png

引入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

111801.png

?

111802.png

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

111803.png

? 新建包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):

111804.png
  • 新建包路徑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ù)提供者搭建成功。

111601.png

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

111806.png
111807.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容