一、Spring Cloud项目搭建

1、建立父工程

​ 首先创建一个父工程,名字为spring cloud打开IDEA(以下编码过程编码工具采用IDEA)。

创建新工程为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 驱动 -->
         <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、建立服务API模块

​ 在父工程中,新建Module,module名称为springcloud-api

在这里插入图片描述

在这里插入图片描述

​ 创建完成后项目结构如下:

在这里插入图片描述

​ 新建包cn.org.july.springcloud.api.entities

​ 新建类User内容如下:

@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User implements Serializable {
    /**
     * 主键
     */
    private Integer id;
    /**
     * 部门名称
     */
    private String userName;
    /**
     * 存储数据库位置(分布式部署可能存在多个数据库)
     */
    private String dbSource;
    /**
     * 电话号
     */
    private Spring phone;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 密码
     */
    private String pwd;

}

说明:此次使用lombok插件;官网 https://www.projectlombok.org/

注解 说明
@Data 在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor注解,即当使用当前注解时,会自动生成包含的所有方法;
@getter 在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;
@setter 在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;
@NoArgsConstructor 在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法;
@AllArgsConstructor 在JavaBean或类JavaBean中使用,使用此注解会生成对应的有参构造方法;
@ToString 在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法;
@EqualsAndHashCode 在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;
@Slf4j 在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@Log4j 在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@Accessors(prefix = {“first”}, fluent = true, chain = false) 与生存的get和set方法有关,prefix与定义属性前缀相同时且接下来的字符大写才生效,可以看源码注释或自行尝试;
fluent是决定生成的get/set方法要不要set/get前缀,chain决定set方法是void类型还是返回this

项目POM文件内容如下:

<?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;
    /**
     * 存储数据库位置(分布式部署可能存在多个数据库)
     */
    private String dbSource;
    /**
     * 电话号
     */
    private Spring phone;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 密码
     */
    private String pwd;

}

3、建立服务提供者

​ 在父工程中,新建Module,module名称为springcloud-provider-user-8001

​ 创建过程如上,不再截图。

修改该Module 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">
    <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>
        <!-- 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <!-- 数据库驱动-->
        <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>

我们这里主要是讲整体架构搭建,我们不具体实现复杂的业务逻辑。以下只实现查询接口

在新建的Module中建立如下项目结构:

在这里插入图片描述

  • 新建包路径cn.org.july.springcloud.dao;cn.org.july.springcloud.service;cn.org.july.springcloud.controller;

  • resources目录下创建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                   #当前数据源操作类型
        driver-class-name: com.mysql.cj.jdbc.Driver                    #mysql驱动包
        url: jdbc:mysql://127.0.0.1:3306/cloudDB01                     #数据库连接
        username: root
        password: xxxx
        dbcp2:
          min-idle: 5                                                   #数据库连接池的最小维持连接数
          initial-size: 5                                               #初始化连接数
          max-total: 5                                                  #最大连接数
          max-wait-millis: 200                                          #等待连接获取的最大超时时间
    
    

    注意

    spring:
      application:
        name: springcloud-user
    
  • 新建数据库cloudDB01执行以下脚本

    /*
     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', '[email protected]', '123456'), ('2', 'WHJ', 'cloudDB01', '12312312312', '[email protected]', '123456');
    COMMIT;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
  • 在dao中新建类:UserDao.内容如下:

    @Mapper
    public interface UserDao {
    
        @Select("select * from user")
        List<User> findAll();
    
        @Select("select * from user where id = #{id}")
        User findById(Long id);
    
    }
    
  • 在service中新建类:UserService。内容如下:

    @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。内容如下:

    @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);
        }
    }
    
    
  • 创建服务启动类Application_provider_8001。内容如下:

    @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;返回内容如下,说明服务提供者搭建成功。

在这里插入图片描述

4、创建服务消费者

​ 新建Module,名称为springcloud-consumer-user-8000

创建过来不在详细讲述;创建完成后,项目结构目录如下:

在这里插入图片描述

  • springcloud-consumer-user-8000中,新建包结构,cn.org.july.springcloud.cfgbean;cn.org.july.springcloud.controller.

  • resources目录新建application.yml配置文件

    server:
      port: 8000
    

    作为服务消费者,只需要指定服务端口即可。

  • cn.org.july.springcloud.cfgbean包创建ConfigBean.内容如下:

    @Configuration
    public class ConfigBean {
        @Bean
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    

    关于这两个注解,笔者在Spring Boot 中已经详细讲解过,有想了解,提供传送门;https://blog.csdn.net/July_whj/article/details/83449911

    RestTemplate: RestTemplate 提供了多种便捷访问远程HTTP服务的方法,是一种简单便捷的访问restful服务模版类,是Spring提供的用于访问Rest服务的客户端模版工具集。详情查看官方网站 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

  • controller中新建UserController_Consumer类。(这里命名有点怪。。。)

    @RestController
    public class UserController_Consumer {
    	/**
    	 * 服务提供方地址
    	 */
        private static final String url = "http://localhost:8001/";
    
        /**
         * RestTemplate 提供了多种便捷访问远程HTTP服务的方法
         * 是一种简单便捷的访问restful服务模版类,是Spring提供的用于访问
         * Rest服务的客户端模版工具集
         */
        @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);
        }
    
    }
    

    这里和服务提供者的区别访问地址新增consumer路径。

  • 创建服务启动类Application_consumer_8000,内容如下:

    @SpringBootApplication
    public class Application_consumer_8000 {
        public static void main(String[] args) {
            SpringApplication.run(Application_consumer_8000.class, args);
        }
    }
    
  • 首先启动服务提供者服务springcloud-provider-user-8001,在启动服务消费者springcloud-consumer-user-8000.服务启动成功后访问 http://localhost:8000/consumer/user/1;http://localhost:8000/consumer/user/all

在这里插入图片描述

在这里插入图片描述

出现以上结果,服务消费者配置成功。该程序只做简单实例。

猜你喜欢

转载自blog.csdn.net/July_whj/article/details/85476857