SpringCloud学习之二构建案例工程模块

4.Rest微服务构建案例工程模块

4.1 总体介绍

l  承接着我们的spirngmvc+mybatis+mysql初级高级课程,以Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务

n  已经学习过的知识springmvc

n  已经学习过的知识mybaits

l  Maven的分包分模块架构复习

一个简单的Maven模块结构是这样的:

----- app-parent 一个父项目(app-parent)聚合很多子项目(app-util,app-dao,app-service,app-web)

         |----- pom.xml(pom)

         |

         |---------- app-util           

||---------- pom.xml(jar)

|

         |---------- app-dao         

||---------- pom.xml(jar)

|

         |---------- app-service            

||---------- pom.xml(jar)

|

         |---------- app-web                 

||---------- pom.xml(war)

 

 

 

l  直接动手干

n  Maven的分包分模块架构复习

一个Project带着多个Module子模块

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

microservicecloud-api 

         封装的整体entity/接口/公共配置等

microservicecloud-provider-dept-8001

         微服务落地的服务提供

microservicecloud-consumer-dept-80

         微服务调用的客户端使用

         80端口

80端口是为HTTP(HyperText Transport Protocol)即超传输协议开放的

此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议

可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,

因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“:80”了。

 

1 父工程

1.1  api公共模块

1.2  GAV

1.3  GAV

1.4  GAV

…….

Dept.java.Entity

4.2 本次springCloud版本

Dalston.SR1

1.5.9.RELEASE

4.3 构建步骤

microservicecloud整体工程Project

l  新建父工程microservicecloud,切记是Packageing是pom模式

 

l  主要是定义POM文件,将后续各个子模块公用的jar包等统一提出来,类似一个

         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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
<modelVersion>4.0.0</modelVersion>

   
<groupId>com.atguigu.springcloud</groupId>
   
<artifactId>microservicecloud</artifactId>
   
<version>1.0-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>
   

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

</
project>

microservicecloud-api公共子模块Module

l  新建microservicecloud-api


l  修改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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

   
<parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
       
<groupId>com.atguigu.springcloud</groupId>
       
<artifactId>microservicecloud</artifactId>
       
<version>1.0-SNAPSHOT</version>
   
</parent>
   
<modelVersion>4.0.0</modelVersion>

   
<artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->

    <dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
        <dependency>
 
           <groupId>org.projectlombok</groupId>
           
<artifactId>lombok</artifactId>
       
</dependency>
       
<dependency>
           
<groupId>org.springframework.cloud</groupId>
           
<artifactId>spring-cloud-starter-feign</artifactId>
       
</dependency>
   
</dependencies>

</
project>

 

l  新建Entity且配合lombok使用

 

package com.atguigu.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

//@AllArgsConstructor   //全参构造函数
@NoArgsConstructor    //空参构造函数
@Data
@Accessors(chain = true)   //链式风格访问
public class Dept implements Serializable { //Dept(Entity) orm mysql->Dept(table) 类表关系映射  必需实现序列化
    private Integer deptno; //主键
    private String dname; //部门名称
    private String db_source; //来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库

    public Dept(String dname)
    {
        super();
        this.dname = dname;
    }
}

l  Mvn clean install后给其它模块引用,达到通用目。

也即需要用到部门实体的话,不用每个工程都定义一份,直接引用本模块即可

microservicecloud-provider-dept-8001部门微服务提供者Module

l  新建microservicecloud-provider-dept-8001

l  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">
   
<parent>
       
<artifactId>microservicecloud</artifactId>
       
<groupId>com.atguigu.springcloud</groupId>
       
<version>1.0-SNAPSHOT</version>
   
</parent>
   
<modelVersion>4.0.0</modelVersion>

 
  <artifactId>microservicecloud-provider-dept-8001</artifactId>

   
<dependencies>
       
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity-->
        <dependency>
           
<groupId>com.atguigu.springcloud</groupId>
           
<artifactId>microservicecloud-api</artifactId>
           
<version>${project.version}</version>
       
</dependency>
       
<!-- actuator监控信息完善 -->
       
<dependency>
           
<groupId>org.springframework.boot</groupId>
           
<artifactId>spring-boot-starter-actuator</artifactId>
       
</dependency>
       
<dependency>
           
<groupId>junit</groupId>
           
<artifactId>junit</artifactId>
       
</dependency>
       
<!-- mysql驱动包 -->
       
<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>
       
<!-- mybatis的整合 -->
       
<dependency>
           
<groupId>org.mybatis.spring.boot</groupId>
           
<artifactId>mybatis-spring-boot-starter</artifactId>
       
</dependency>
       
<!-- boot的jetty 内置tomcat插件-->
        <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>

 

l  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: kashowres
   
dbcp2:
     
min-idle: 5                                           # 数据库连接池的最小维持连接数
     
initial-size: 5                                      # 初始化连接数
     
max-total: 5                                          # 最大连接数
     
max-wait-millis: 200                                  # 等待连接获取的最大超时时间

 

l  MySQL创建部门数据库脚本

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;

l  DeptDao部门接口

package com.atguigu.springcloud.dao;

import com.atguigu.springcloud.entities.Dept;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface DeptDao {
   
public boolean addDept(Deptdept);

   
public DeptfindById(Longid);

   
public List<Dept>findAll();
}

 

l  工程src/main/resources/mybatis目录下新建mapper文件夹后再建DeptMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC"-//mybatis.org//DTD Mapper3.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 wheredeptno=#{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>
 

 

l  DeptService部门服务接口

package com.atguigu.springcloud.service;

import com.atguigu.springcloud.entities.Dept;

import java.util.List;

public interface DeptService {
   
public boolean addDept(Deptdept);

   
public Deptget(Longid);

   
public List<Dept>list();
}

 

l  DeptServiceImpl部门服务接口实现类

package com.atguigu.springcloud.service.impl;

import com.atguigu.springcloud.dao.DeptDao;
import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DeptServiceImpl implementsDeptService {

   
@Autowired
   
private DeptDaodeptDao;

   
@Override
   
public boolean addDept(Deptdept) {
       
deptDao.addDept(dept);
       
return false;
   
}

    @Override
   
public Deptget(Longid) {
       
return deptDao.findById(id);
   
}

    @Override
   
public List<Dept>list() {
       
return deptDao.findAll();
   
}
}

l  DeptController部门微服务提供者REST

package com.atguigu.springcloud.controller;

import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class DeptController {
   
@Autowired
   
private DeptServicedeptService;

   
@RequestMapping(value = "/dept/add",method = RequestMethod.POST)
   
public boolean add(@RequestBodyDept dept){
       
return deptService.addDept(dept);
   
}

    @RequestMapping(value ="/dept/get/{id}",method = RequestMethod.GET)
   
public Deptget(@PathVariable("id") Long id){
       
return deptService.get(id);
   
}

    @RequestMapping(value ="/dept/list",method = RequestMethod.GET)
   
public List<Dept>list(@PathVariable("id") Long id){
       
return deptService.list();
   
}
}

 

DeptProvider8001_App主启动类DeptProvider8001_App

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);
   
}
}

 

l  测试

启动DeptProvider8001_App



 

microservicecloud-consumer-dept-80 部门微服务消费者Module

l  新建microservicecloud-consumer-dept-80

l  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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
<parent>
       
<artifactId>microservicecloud</artifactId>
       
<groupId>com.atguigu.springcloud</groupId>
       
<version>1.0-SNAPSHOT</version>
   
</parent>
   
<modelVersion>4.0.0</modelVersion>

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


l  YML

server:
  port: 80

 

l  com.atguigu.springcloud.cfgbeans包下ConfigBean的编写(类似spring里面的applicationContext.xml写入Bean)

 

RestTemplate

代码

 

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 {   //boot  -->spring  applicationContext.xml  --- @Configuration配置  ConfigBean = applicationContext.xml
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
/*@Bean
    public UserService getUseService(){
        return new UserServiceImpl();
    }*/
//applicationContext.xml  == ConfigBean(@Configuration)
//<bean id="userService" class="com.atguigu.tmall.UserServiceImpl">

 

l  com.atguigu.springcloud.controller包下新建DeptController_Consumer部门微服务消费者REST

n  RestTemplate

JDBC             spring               JDBCTemplate

redis                      spring               redisTemplate

结果             spring               RestTemplate

是什么

RestTemplate提供了多种便捷访问远程Http服务的方法

是一种简便捷的访问restful服务模版,是Spring提供的用于访问Rest服务的客户端模板工具集

 

官网及使用

 

官网地址

https://docs.spring.io/spring-framework/docs/4.3.7.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

使用

使用restTemplate访问restful接口非常的简单粗暴无脑

(url, requestMap, ResponseBean.class)这三个参数分别代表

REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。

package com.atguigu.springcloud.controller;

import com.atguigu.springcloud.entities.Dept;
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.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class DeptController_Consumer {

    private static final String REST_URL_PREFIX = "http://localhost:8001";

    /*使用restTemplate访问restful接口非常的简单粗暴无脑
    (url, requestMap, ResponseBean.class)这三个参数分别代表
    REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。*/

    @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);
    }

    @RequestMapping(value = "/consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }
}

l  DeptConsumer80_App主启动类

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);
   
}
}

l  测试


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


http://localhost/consumer/dept/list


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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值