SpringCloud笔记二:搭建项目基础框架
搭建框架
我们的SpringCloud微服务框架是父子工程,有一个父工程,剩下的都是子工程,我们可以新建一个公用Bean的子工程叫api,其他的子工程用到相同的Bean的时候调用api项目的Bean就可以了,实现了公用。
新建父工程
打开idea,新建一个Maven项目,如图:

后面的就不截图了,起个名字就可以了。
新建子工程api
我们新建一个子工程api,这个api子工程目的是,公用一些Bean

在我们的项目上右键,new,Module,然后选择SpringBoot吧,我喜欢SpringBoot

后面的名字看着起,需要的工具自己看着加,这个api我们需要Lombok就够了

项目新建完成之后,我们新建一个Bean,用于和数据库映射,其他的子项目也会公用这个Bean

自己新建,我的DeptEntity的Bean使用了Lombok,代码如下
package com.vae.springcloud.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@AllArgsConstructor //全参数的构造函数
@NoArgsConstructor //无参数的构造函数
@Data //get和set方法
@Accessors(chain = true) //链式访问,使用链式创建的set方法有返回值
@SuppressWarnings("serial") //忽略黄色警告
public class DeptEntity implements Serializable {
private Integer did;//部门id,主键
private String dname;//部门名称
private String dbsource;//来自哪个数据库的标识列
}
接下来就是要把这个Bean和数据库进行映射了,你可以使用JPA进行映射,也可以自己去手动创建,我把我的数据库贴出来,你可以复制使用
#数据库是shuyunquan,下面是表数据以及结构
create table deptentity
(
did int ,primary key,not null,
dname varchar(10) null,
dbsource varchar(30) null,
constraint deptentity_did_uindex
unique (did)
);
INSERT INTO shuyunquan.deptentity (did, dname, dbsource) VALUES (1, '软件部', database());
INSERT INTO shuyunquan.deptentity (did, dname, dbsource) VALUES (2, '研发部', database());
INSERT INTO shuyunquan.deptentity (did, dname, dbsource) VALUES (3, '工程部', database());
INSERT INTO shuyunquan.deptentity (did, dname, dbsource) VALUES (4, '市场部', database());
新建子工程提供者provider
其实,我们已经搭建好框架了,现在和以后的新建项目都和子工程一样,剩下的,就是新技术的学习了,我们先来一个提供者provider子项目,主要用于提供对部门的增删改查操作接口
新建provider,还是一样的,父工程右键new,Module

还是选择SpringBoot项目。我先把项目贴出个图出来,让你们知道怎么新建,位置

我们新建dao接口,去和Mybatis进行数据操作
package com.vae.springcloud.dao;
import com.vae.springcloud.entity.DeptEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface DeptDAO {
public boolean addDept(DeptEntity deptEntity);
public DeptEntity findById(Integer id);
public List<DeptEntity> findAll();
public boolean deleteDept(Integer id);
public void updateDept(DeptEntity deptEntity);
}
有了dao,就要有Mybatis文件了
<?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>
<!--别名-->
<typeAliases>
<typeAlias type="com.vae.springcloud.entity.DeptEntity" alias="DeptEntity"></typeAlias>
</typeAliases>
</configuration>
这里需要注意的是我的mapper.xml没有写在Mybatis.xml里面,不要写,写了报错
下面是我的mapper的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 -->
<mapper namespace="com.vae.springcloud.dao.DeptDAO">
<!--
数据库查询数据
insert、select、delete、update:sql语句类型
id:sql语句唯一标识
resultType:结果返回值类型-包名+类名 或 基本数据类型
parameterType:匹配字段值-包名+类名 或 基本数据类型
-->
<select id="findAll" resultType="DeptEntity">
select did,dname,dbsource from deptentity
</select>
<select id="findById" parameterType="DeptEntity" resultType="Long">
select did,dname,dbsource from deptentity where did=#{did}
</select>
<insert id="addDept" parameterType="DeptEntity">
insert into deptentity values(#{did},#{dname},database())
</insert>
<delete id="deleteDept" parameterType="Integer">
delete from deptentity where did = #{did}
</delete>
<update id="updateDept" parameterType="DeptEntity">
update deptentity set did=#{did},dname=#{dname},dbsource=#{dbsource} where did =#{did};
</update>
</mapper>
Mybatis文件和与dao对应的mapper.xml也有了,下面就是yml了
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路径
type-aliases-package: com.vae.springcloud.entity #所有Entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml #mapper映射文件
spring:
application:
name: provider-dept
datasource:
# type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/shuyunquan?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
我的提供者端口号是8001,还有Mybatis配置写了xml的所在位置,这个就是为什么我的Mybatis.xml里面没有写mapper.xml的原因,以后都这样写吧,就使用这种方式了。
现在dao有了,Mybatis配置文件有了,yml也有了,现在和dao对应的service接口新建一下
讲真,我现在还不是很清楚为什么有dao了还要有个对应的service,说的一个和数据沟通,一个和业务沟通,反正我现在理解的还不是很透彻。
package com.vae.springcloud.service;
import com.vae.springcloud.entity.DeptEntity;
import java.util.List;
public interface DeptService {
public boolean addDept(DeptEntity deptEntity);
public DeptEntity findById(Integer id);
public List<DeptEntity> findAll();
public boolean deleteDept(Integer id);
public void updateDept(DeptEntity deptEntity);
}
看看service接口的实现类
package com.vae.springcloud.service.impl;
import com.vae.springcloud.dao.DeptDAO;
import com.vae.springcloud.entity.DeptEntity;
import com.vae.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDAO deptDAO;
@Override
public boolean addDept(DeptEntity deptEntity) {
return deptDAO.addDept(deptEntity);
}
@Override
public DeptEntity findById(Integer id) {
return deptDAO.findById(id);
}
@Override
public List<DeptEntity> findAll() {
return deptDAO.findAll();
}
@Override
public boolean deleteDept(Integer id) {
return deptDAO.deleteDept(id);
}
@Override
public void updateDept(DeptEntity deptEntity) {
deptDAO.updateDept(deptEntity);
}
}
最后,新建一个Controller
package com.vae.springcloud.controller;
import com.vae.springcloud.entity.DeptEntity;
import com.vae.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 DeptService deptService;
@PostMapping(value = "/dept/add")
public boolean add(@RequestBody DeptEntity deptEntity){
return deptService.addDept(deptEntity);
}
@GetMapping(value = "/dept/get/{id}")
public DeptEntity get(@PathVariable("id") Integer id){
return deptService.findById(id);
}
@GetMapping(value = "/dept/list")
public List<DeptEntity> get() throws Exception{
return deptService.findAll();
}
@GetMapping(value = "/dept/delete/{id}")
public boolean delete(@PathVariable("id") Integer id){
return deptService.deleteDept(id);
}
@GetMapping(value = "/dept/update")
public void update(@RequestBody DeptEntity deptEntity){
deptService.updateDept(deptEntity);
}
}
至此,提供者provider已经创建完了,运行项目,输入:http://localhost:8001/dept/list
可以出来部门列表就表明成功了

忘了说一件事,我贴出来我的provider的Maven的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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.vae.springcloud</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>provider project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>com.vae.springcloud</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里面的这个
<dependency>
<groupId>com.vae.springcloud</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
就是我们的provider子项目调用了api子项目的Bean,版本号使用了${project.version},这样api版本升级了也会自动的变的,idea可以自动加这些内容的
新建消费者consumer
有了提供者提供接口,我们消费者只需要调用访问接口就可以了,其他的不需要
新建项目还是一样的,module,SpringBoot。我不讲了,直接贴结构

先贴yml配置
server:
port: 80
新建一个ConfigBean
package com.vae.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();
}
}
这里面主要是使用了RestTemplate,我们将使用这个对Rest风格的接口的一个访问操作
新建Controller
package com.vae.springcloud.controller;
import com.vae.springcloud.entity.DeptEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
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";
@Autowired
private RestTemplate restTemplate;
@PostMapping(value = "/consumer/dept/add")
public boolean add(DeptEntity deptEntity){
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",deptEntity,Boolean.class);
}
@GetMapping(value = "/consumer/dept/get/{id}")
public DeptEntity get(@PathVariable("id") Integer id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get"+id,DeptEntity.class);
}
@SuppressWarnings("unchecked")
@GetMapping(value = "/consumer/dept/list")
public List<DeptEntity> list() throws Exception{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
}
@GetMapping(value = "/consumer/dept/delete/{id}")
public boolean delete(@PathVariable("id") Integer id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/delete"+id,Boolean.class);
}
@GetMapping(value = "/consumer/dept/update")
public void update(@RequestBody DeptEntity deptEntity){
restTemplate.postForObject(REST_URL_PREFIX+"/dept/update",deptEntity,Boolean.class);
}
}
最后,贴出我的Maven的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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.vae.springcloud</groupId>
<artifactId>consumer-80</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer-80</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.vae.springcloud</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-loadbalancer</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-loadbalancer</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.0.4.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-beta-1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.8.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
保持provider项目的运行,我们启动consumer项目,输入http://localhost/consumer/dept/list
出现部门信息,就表明成功了

总结
这一章,使用了父子工程,新建了api,provider,consumer三个子工程,并且实现了provider和consumer的数据接口提供和访问。有了这个基础,我们开始正式进军微服务的大门了,下一章讲解Eureka
SpringCloud笔记二:搭建项目基础框架的更多相关文章
- MUI项目基础框架
码云SVN仓库地址:https://gitee.com/lim2018/vx/tree/master MUI项目基础框架,底部导航栏切换 目录结构 index为入口页主体,sub1-4为要切换的子页面 ...
- tensorflow学习笔记二:入门基础 好教程 可用
http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础 TensorFlow用张量这种数据结构来表示所有的数据.用一 ...
- SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
1.概念:Restful 基础架构 2.具体内容 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为 了清 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架1
目标:教大家搭建一个简易的前后端分离的项目框架. 目录: 1:关于项目架构的概念 2:前后端分离的开发模式 3:搭建框架的各个部分 这段时间比较闲,所以想把之前项目里用到的一些技术写到博客里来,分享给 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架4
实现目的:配置website端与服务端对接 1:配置好各项配置文件 2:server端编写接口客户端调用 1.1首先配置文件有log4的配置文件,有config的配置文件,还有服务列表的配置文件 首先 ...
- django学习笔记二:一个项目多个App项目搭建
django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架2
本篇目的:封装一些抽象类 1::封装日志相关类 2:封装一个Service操作类 3:封装缓存操作类 4:封装其他一些常用Helper 1.1在Framework项目里面建立好相关操作类文件夹,以便于 ...
- AS3项目基础框架搭建分享robotlegs2 + starling1.3 + feathers1.1
这个框架和我之前使用robotlegs1版本的大体相同,今天要写一个新的聊天软件就把之前的框架升级到了2.0并且把代码整理了一下. 使用适配器模式使得starling的DisplayObject和fl ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架3
1:使用Framework工具类封装http请求 接上第二篇的步骤,现在在站点中使用封装好的组件,将framework编译好之后把dll提取出来,然后放到lib当中 在website中引用dll 接下 ...
随机推荐
- VS2015 IIS Express Web服务器无法启动解决办法
1.运行和调试vs2015项目 提示无法运行项目,打开vs2013项目发现可以正常运行,所以推测试vs2015项目配置有问题. 2.找到项目启动项中 .csproj文件,定位到<WebProje ...
- SQLServer之视图简介
视图定义 视图是一个虚拟表,其内容由查询定义. 同表一样,视图包含一系列带有名称的列和行数据. 视图在数据库中并不是以数据值存储集形式存在,除非是索引视图. 行和列数据来自由定义视图的查询所引用的表, ...
- SQLServer之修改CHECK约束
使用SSMS数据库管理工具修改CHECK约束 1.打开数据库,选择数据表->右键点击->选择设计(或者展开约束,选择约束,右键点击,选择修改,后面步骤相同). 2.选择要修改的数据列-&g ...
- iOS Password AutoFill开发指南
转载请标明来源:https://www.cnblogs.com/zhanggui/p/9431950.html 引言 在<iPhone User Guide for iOS 11.4>这本 ...
- Django--session(登录用)
一.session的原理图 二.Django中session对象的设置/读取/删除及其他方法 三. Django--配置 settings.py中与session有关的参数 一.session的原理图 ...
- Redis操作hash
来自:http://www.cnblogs.com/alex3714/articles/6217453.html Hash操作 hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强 ...
- 【Python 20】BMR计算器4.0(异常处理)
1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...
- Chrome Inspect调试微信出现404,需要FQ
要么FQ,要么买个程序 见连接 http://www.cnblogs.com/slmk/p/7591126.html
- 父进程结束,其子进程不会结束,会挂到init进程下
结论:一个父进程产生子进程,父进程结束(kill),子进程不会结束,子进程被init进程托管 下面是过程: d.sh脚本是一个ping命令,执行d.sh 目前,103310 进程为父进程,103344 ...
- python 基本数据类型以及运算符操作
一.基本数据类型 为何要区分类型? 数据类型的值是变量值得类型,变量值之所以区分类型,是因为变量的值 用来记录事物的状态,而事物的状态有不同的种类,对应着,也必须用不 用类型去区分它们. 1.数字类型 ...