1.創建父工程
2.父工程pom.xml文件內容
目錄結構截圖
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.jiangjy.springcloud</groupId> <artifactId>springcloud-model</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.20</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.1.38</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> |
3. springcloud-model-api公共子模塊Module
約定 > 配置 > 編碼
Maven Module 子模塊
<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.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <!-- 當前Module我自己叫什麼名字 --> <artifactId>springcloud-model-api</artifactId>
<!-- 當前Module需要用到的jar包,按自己需求添加,如果父類已經包含了,可以不用寫版本號 --> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project> |
新建部門pojo且配合lombok使用
package com.jiangjy.springcloud.pojo;
import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors;
@AllArgsConstructor//全部帶參構造器 @NoArgsConstructor//無參構造器 @Data//getter setter方法 @Accessors(chain=true)//鏈式結構 public class Dept implements Serializable{ private static final long serialVersionUID = 1L; private Long deptno;//主鍵 private String dname;//部門名稱 private String db_source;//來自哪個數據庫,因爲微服務架構可以一個服務對應一個數據庫,同一個信息被存儲到不同的數據庫 public Dept(String dname) { super(); this.dname = dname; }
}
|
數據庫表及數據
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `dept`
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`deptno` bigint(20) NOT NULL AUTO_INCREMENT,
`dname` varchar(60) DEFAULT NULL,
`db_source` varchar(60) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('1', '法務部', DATABASE());
INSERT INTO `dept` VALUES ('2', '開發部', DATABASE());
INSERT INTO `dept` VALUES ('3', '人事部', DATABASE());
INSERT INTO `dept` VALUES ('4', '財務部', DATABASE());
INSERT INTO `dept` VALUES ('5', '市場部', DATABASE());
INSERT INTO `dept` VALUES ('6', '運維部', DATABASE());
INSERT INTO `dept` VALUES ('7', '後勤部', DATABASE());
當前子項目右鍵-Run As-Maven clean
mvn clean install後給其它模塊引用,達到通用目的。 也即需要用到部門實體的話,不用每個工程都定義一份,直接引用本模塊即可。 |
4. springcloud-model-provider-dept-8001 部門微服務提供者Module
創建子模塊(生產者-供應商)
配置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.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<artifactId>springcloud-model-provider-dept-8001</artifactId>
<dependencies> <!-- 引入自己定義的api通用包,可以使用Dept部門pojo <version>${project.version}</version>靈活的版本 --> <dependency> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model-api</artifactId> <version>${project.version}</version> </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-spring整合 --> <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> |
配置application.yml
server: port: 8001 #訪問的端口號
#mybatis整合 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路徑 type-aliases-package: com.jiangjy.springcloud.pojo #所有pojo別名類所在包 mapper-locations: - classpath:mybatis/mappers/*.xml #mapper映射文件
#spring整合 spring: application: name: springcloud-model-dept #項目對外暴露的訪問名稱 datasource: type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型 driver-class-name: com.mysql.jdbc.Driver # mysql驅動包 com.mysql.jdbc.Driver的前身是org.gjt.mm.mysql.Driver, # 現在主要用com.mysql.jdbc.Driver,但爲了保持兼容性保留了org.gjt.mm.mysql.Driver這個路徑的引用。 url: jdbc:mysql://localhost:3306/springcloud01 # 數據庫名稱 username: root password: root dbcp2: min-idle: 5 # 數據庫連接池的最小維持連接數 initial-size: 5 # 初始化連接數 max-total: 5 # 最大連接數 max-wait-millis: 200 # 等待連接獲取的最大超時時間
|
Dao層
package com.jiangjy.springcloud.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.jiangjy.springcloud.pojo.Dept;
@Mapper public interface DeptDao {
//查詢所有 public List<Dept> findAll();
//根據Id查詢 public Dept findById(Long id);
//添加 public boolean addDept(Dept dept); }
|
Dao 的mapper
<?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.jiangjy.springcloud.dao.DeptDao">
<select id="findAll" resultType="com.jiangjy.springcloud.pojo.Dept"> select deptno,dname,db_source from dept </select>
<select id="findById" resultType="com.jiangjy.springcloud.pojo.Dept"> select deptno,dname,db_source from dept where deptno=#{deptno} </select>
<insert id="addDept" parameterType="com.jiangjy.springcloud.pojo.Dept"> INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE()) </insert> </mapper> |
Service層
package com.jiangjy.springcloud.service;
import java.util.List;
import com.jiangjy.springcloud.pojo.Dept;
public interface DeptService {
// 查詢所有 public List<Dept> getAll();
// 根據Id查詢 public Dept getById(Long id);
// 添加 public boolean addDept(Dept dept); }
|
Service 實現層impl
package com.jiangjy.springcloud.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import com.jiangjy.springcloud.dao.DeptDao; import com.jiangjy.springcloud.pojo.Dept; import com.jiangjy.springcloud.service.DeptService;
@Service public class DeptServiceImpl implements DeptService {
@Autowired private DeptDao deptDao;
@Override public List<Dept> getAll() {
return deptDao.findAll(); }
@Override public Dept getById(Long id) {
return deptDao.findById(id); }
@Override public boolean addDept(Dept dept) { return deptDao.addDept(dept); }
}
|
Controller控制層
package com.jiangjy.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.PostMapping; 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.jiangjy.springcloud.pojo.Dept; import com.jiangjy.springcloud.service.DeptService;
@RestController public class DeptController {
@Autowired private DeptService deptService;
@RequestMapping(value="/dept/add",method = RequestMethod.POST) public boolean add(@RequestBody Dept dept) {
return deptService.addDept(dept); }
@RequestMapping(value="/dept/getById/{id}",method = RequestMethod.GET) public Dept getById(@PathVariable("id") Long id) {
return deptService.getById(id); }
@RequestMapping(value="/dept/getAll",method = RequestMethod.GET) public List<Dept> getAll() {
return deptService.getAll(); }
}
|
主啓動類
package com.jiangjy.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); } }
|
代碼啓動
數據展示
5.springcloud-model-consumer-dept-80部門微服務消費者Module
創建子模塊 消費者
約定 > 配置 > 編碼約定 > 配置 > 編碼
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.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>springcloud-model-consumer-dept-80</artifactId> <description>部門微服務消費者</description>
<dependencies> <dependency><!-- 自己定義的api --> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model-api</artifactId> <version>${project.version}</version> </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.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </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> |
application.yml 文件
server: port: 80 |
Ribbon詳解 - 簡書 https://www.jianshu.com/p/1bd66db5dc46
package com.jiangjy.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 * @return */ @Bean public RestTemplate geRestTemplate() { return new RestTemplate(); } } //@Bean //public UserServcie getUserServcie() //{ // return new UserServcieImpl(); //} //applicationContext.xml == ConfigBean(@Configuration) //<bean id="userServcie" class="com.jiangjy.service.impl.UserServiceImpl"> |
消費者控制層
package com.jiangjy.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.jiangjy.springcloud.pojo.Dept;
@RestController public class DeptController_Consumer {
public static final String REST_URL_PREFIX = "http://localhost:8001"; /** * 使用 使用restTemplate訪問restful接口非常的簡單粗暴無腦。 * (url, request, responseType)這三個參數分別代表 REST請求地址、請求參數、HTTP響應轉換被轉換成的對象類型。 */ @Autowired private RestTemplate restTemplate;
@RequestMapping("/consumer/dept/add") public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class); }
@RequestMapping("/consumer/dept/getById/{id}") public Dept getById(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/getById/"+ id, Dept.class); }
@SuppressWarnings("unchecked") @RequestMapping("/consumer/dept/getAll") public List<Dept> getAll() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/getAll", List.class); }
}
|
主啓動類
package com.jiangjy.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); } }
|
運行結果圖:
基礎的微服務底層程序到此已基本完成