zoukankan      html  css  js  c++  java
  • (02)SpringCloud实战之Rest微服务构建案例工程模块

      一、简单介绍:

      1、版本

      Cloud 版本:Dalston.SR1

      Boot   版本:1.5.9.RELEASE

      2、模块架构

      MicroServiceCloud父工程(Project)下初次带着3个子模块(Module)

        microservicecloud-api(封装的整体Entity/接口/公共配置等)

        microservicecloud-provider-dept-8001(微服务落地的服务提供者)

        microservicecloud-consumer-dept-80(微服务调用的客户端使用)

      二、构建步骤

      1、构建父工程 microservicecloud

      父工程只有一个pom.xml,Packageing是pom模式,将后续各个子模块公用的jar包等统一提出来,类似一个抽象父类。

      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">
      <modelVersion>4.0.0</modelVersion>
     
      <groupId>com.atguigu.springcloud</groupId>
      <artifactId>microservicecloud</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
     
     
      <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <junit.version>4.12</junit.version>
       <log4j.version>1.2.17</log4j.version>
       <lombok.version>1.16.18</lombok.version>
      </properties>
     
      <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>Dalston.SR1</version>
           <type>pom</type>
           <scope>import</scope>
         </dependency>
         <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-dependencies</artifactId>
           <version>1.5.9.RELEASE</version>
           <type>pom</type>
           <scope>import</scope>
         </dependency>
         <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.0.4</version>
         </dependency>
         <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid</artifactId>
           <version>1.0.31</version>
         </dependency>
         <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>1.3.0</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>
    </project>
    View Code

      2、构建模块 microservicecloud-api

      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">
      <modelVersion>4.0.0</modelVersion>
     
      <parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
       <groupId>com.atguigu.springcloud</groupId>
       <artifactId>microservicecloud</artifactId>
       <version>0.0.1-SNAPSHOT</version>
      </parent>
     
      <artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->
     
      <dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
       <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
       </dependency>
      </dependencies>
      
    </project>
    View Code

      Dept.java

     
    package com.atguigu.springcloud.entities;
     
    import java.io.Serializable;
     
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.experimental.Accessors;
     
    @SuppressWarnings("serial")
    @NoArgsConstructor //无参构造函数
    @Data //get set 方法
    @Accessors(chain=true) //链式访问
    public class Dept implements Serializable //必须序列化
    {
      private Long  deptno; //主键
      private String  dname; //部门名称
      private String  db_source; //来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库
      
      public Dept(String dname)
      {
       super();
       this.dname = dname;
      }
    }
     
    View Code

      注意:此时父工程的pom.xml已经添加了模块

    <modules>
      <module>microservicecloud-api</module>
    </modules>

      3、构建模块 microservicecloud-provider-dept-8001

      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">
      <modelVersion>4.0.0</modelVersion>
     
      <parent>
       <groupId>com.atguigu.springcloud</groupId>
       <artifactId>microservicecloud</artifactId>
       <version>0.0.1-SNAPSHOT</version>
      </parent>
     
      <artifactId>microservicecloud-provider-dept-8001</artifactId>
     
      <dependencies>
       <dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
         <groupId>com.atguigu.springcloud</groupId>
         <artifactId>microservicecloud-api</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
       </dependency>
       <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
       </dependency>
       <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
       </dependency>
       <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
       </dependency>
       <dependency>
         <groupId>org.mybatis.spring.boot</groupId>
         <artifactId>mybatis-spring-boot-starter</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jetty</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-test</artifactId>
       </dependency>
       
       <!-- 修改后立即生效,热部署 -->
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>springloaded</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
       </dependency>
      </dependencies>
     
    </project>
    View Code

      application.yml

    server:
      port: 8001
      
    mybatis:
      config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
      type-aliases-package: com.atguigu.springcloud.entities    # 所有Entity别名类所在包
      mapper-locations:
      - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件
        
    spring:
       application:
        name: microservicecloud-dept 
       datasource:
        type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
        driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
        url: jdbc:mysql://localhost:3306/cloudDB01              # 数据库名称
        username: root
        password: 123456
        dbcp2:
          min-idle: 5                                           # 数据库连接池的最小维持连接数
          initial-size: 5                                       # 初始化连接数
          max-total: 5                                          # 最大连接数
          max-wait-millis: 200                                  # 等待连接获取的最大超时时间
     
     
    View Code

      mybatis/mybatis.cfg.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
      
    <configuration>
     
      <settings>
       <setting name="cacheEnabled" value="true"/><!-- 二级缓存开启 -->
      </settings>
     
    </configuration>
    View Code

      执行建库、建表语句

    DROP DATABASE IF EXISTS cloudDB01;
    CREATE DATABASE cloudDB01 CHARACTER SET UTF8;
    USE cloudDB01;
    CREATE TABLE dept
    (
      deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      dname VARCHAR(60),
      db_source   VARCHAR(60)
    );
     
    INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE());
     
    SELECT * FROM dept;
     
     
     
    View Code

      DeptDao.java

    package com.atguigu.springcloud.dao;
     
    import java.util.List;
    import org.apache.ibatis.annotations.Mapper;
    import com.atguigu.springcloud.entities.Dept;
     
    @Mapper
    public interface DeptDao
    {
      public boolean addDept(Dept dept);
     
      public Dept findById(Long id);
     
      public List<Dept> findAll();
    }
     
    View Code

      mybatis/mapper/DeptMapper.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.atguigu.springcloud.dao.DeptDao">
     
      <select id="findById" resultType="Dept" parameterType="Long">
          select deptno,dname,db_source from dept where deptno=#{deptno}; 
      </select>
      
      <select id="findAll" resultType="Dept">
          select deptno,dname,db_source from dept; 
      </select>
      
      <insert id="addDept" parameterType="Dept">
          INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
      </insert>
      
    </mapper>
    View Code

      DeptService.java

    package com.atguigu.springcloud.service;
     
    import java.util.List;
     
    import com.atguigu.springcloud.entities.Dept;
     
    public interface DeptService
    {
      public boolean add(Dept dept);
      
      public Dept    get(Long id);
      
      public List<Dept> list();
    }
    View Code

      DeptServiceImpl.java

    package com.atguigu.springcloud.service.impl;
     
    import java.util.List;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import com.atguigu.springcloud.dao.DeptDao;
    import com.atguigu.springcloud.entities.Dept;
    import com.atguigu.springcloud.service.DeptService;
     
    @Service
    public class DeptServiceImpl implements DeptService{
        
      @Autowired
      private DeptDao dao ;
      
      @Override
      public boolean add(Dept dept)
      {
       return dao.addDept(dept);
      }
     
      @Override
      public Dept get(Long id)
      {
       return dao.findById(id);
      }
     
      @Override
      public List<Dept> list()
      {
       return dao.findAll();
      }
    }
    View Code

      DeptController.java

    package com.atguigu.springcloud.controller;
     
    import java.util.List;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    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.RestController;
     
    import com.atguigu.springcloud.entities.Dept;
    import com.atguigu.springcloud.service.DeptService;
     
    @RestController
    public class DeptController{
        
      @Autowired
      private DeptService service;
      
      @RequestMapping(value="/dept/add",method=RequestMethod.POST)
      public boolean add(@RequestBody Dept dept)
      {
       return service.add(dept);
      }
      
      @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
      public Dept get(@PathVariable("id") Long id)
      {
       return service.get(id);
      }
      
      @RequestMapping(value="/dept/list",method=RequestMethod.GET)
      public List<Dept> list()
      {
       return service.list();
      }
    }
     
    View Code

      DeptProvider8001_App.java

    package com.atguigu.springcloud;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
     
    @SpringBootApplication
    public class DeptProvider8001_App
    {
      public static void main(String[] args)
      {
       SpringApplication.run(DeptProvider8001_App.class, args);
      }
    }
    View Code

       该模块引入了microservicecloud-api的依赖,切换到microservicecloud-api 执行:clean install。然后运行DeptProvider8001_App

      执行:http://localhost:8001/dept/get/1 若浏览器输出:{"deptno":1,"dname":"开发部","db_source":"clouddb01"} 则访问成功。

      4、构建模块 microservicecloud-consumer-dept-80

      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">
      <modelVersion>4.0.0</modelVersion>
     
      <parent>
       <groupId>com.atguigu.springcloud</groupId>
       <artifactId>microservicecloud</artifactId>
       <version>0.0.1-SNAPSHOT</version>
      </parent>
     
      <artifactId>microservicecloud-consumer-dept-80</artifactId>
      <description>部门微服务消费者</description>
     
      <dependencies>
       <dependency><!-- 自己定义的api -->
         <groupId>com.atguigu.springcloud</groupId>
         <artifactId>microservicecloud-api</artifactId>
         <version>${project.version}</version>
       </dependency> 
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       
       <!-- 修改后立即生效,热部署 -->
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>springloaded</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
       </dependency>   
      </dependencies>
      
    </project>
    View Code

      ConfigBean.java

    package com.atguigu.springcloud.cfgbeans;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
     
    @Configuration
    public class ConfigBean
    {
        @Bean
        public RestTemplate getRestTemplate()
        {
             return new RestTemplate();
        }
    }
    View Code

      DeptController_Consumer.java

    package com.atguigu.springcloud.controller;
     
    import java.util.List;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
     
    import com.atguigu.springcloud.entities.Dept;
     
    @RestController
    public class DeptController_Consumer
    {
        private static final String REST_URL_PREFIX = "http://localhost:8001";
        
        @Autowired
        private RestTemplate restTemplate;
        
        @RequestMapping(value="/consumer/dept/add")
        public boolean add(Dept dept)
        {
             return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);
        }
        
        @RequestMapping(value="/consumer/dept/get/{id}")
        public Dept get(@PathVariable("id") Long id)
        {
             return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
        }
        
        @SuppressWarnings("unchecked")
        @RequestMapping(value="/consumer/dept/list")
        public List<Dept> list()
        {
             return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
        }   
    }
    View Code

      DeptConsumer80_App.java

    package com.atguigu.springcloud;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
     
    @SpringBootApplication
    public class DeptConsumer80_App
    {
      public static void main(String[] args)
      {
       SpringApplication.run(DeptConsumer80_App.class, args);
      }
    }
    View Code

      启动 DeptProvider8001_App 与 DeptConsumer80_App 这两个微服务。测试:

      http://localhost/consumer/dept/get/2

      http://localhost/consumer/dept/list

      http://localhost/consumer/dept/add?dname=AI

      RestTemplate 说明:

      提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。

      官网地址 url, requestMap, ResponseBean.class 这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。

      

      

  • 相关阅读:
    JSP(工作原理,组成部分,指令标签,动作标签,隐式对象)
    会话技术cookie与session
    上下文对象-请求对象-响应对象(ServletContext
    反射
    Servlet
    Tomcat服务器
    Http协议
    客户端与服务器
    Oracle虚拟机 与 windows配置
    SQL语句简单整理
  • 原文地址:https://www.cnblogs.com/javasl/p/12450477.html
Copyright © 2011-2022 走看看