spring cloud之 微服務程序案例實現(一)

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

     }

}

 

 

運行結果圖:

基礎的微服務底層程序到此已基本完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章