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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM