SpringCloud微服務搭建教程

SpringCloud是什麼?

SpringCloud是分佈式一站式的解決方案。

SpringCloud是微服務技術的一種落地的體現和實現。

SpringCloud和SpringBoot的區別和關係?

1.SpringBoot專注於快速方便的開發單個個體微服務。

2.SpringCloud是關注全局的微服務協調整理治理框架以及一整套的落地解決方案,它將SpringBoot開發的一個個單體微服務整合並管理起來,爲各個微服務之間提供:配置管理,服務發現,斷路器,路由,微代理,事件總線等的集成服務。

3.SpringBoot可以離開SpringCloud獨立使用,但是SpringCloud離不開SpringBoot,屬於依賴的關係。

總結:SpringBoot專注於快速,方便的開發單個微服務個體,SpringCloud關注全局的服務治理框架。

SpringCloud和Dubbo區別和對比:

很顯然,SpringCloud功能比Dubbo更加強大,涵蓋面更廣,並且作爲Spring的拳頭項目,它能夠與Spring Framework,SpringBoot,Spring Data等其他Spring項目完美整合,這些對於微服務而言是至關重要的。

而使用Dubbo構建的微服務架構就像組裝電腦,各環節我們的選擇自由度很高,但是最終很可能因爲一條內存質量不行就點不亮了,而SpringCloud就像品牌機,在Spring Source的整合下,做了大量的兼容性測試,保證了機器擁有更高的穩定性,但是如果要在使用非原裝組件外的東西,就需要對其基礎有足夠的瞭解。

那麼最大的區別在於:SpringCloud拋棄了Dubbo的RPC通信,採用的是基於HTTP的REST方式。

SpringCloud的各類資料:

SpringCloud中文API參考使用文檔https://springcloud.cc/spring-cloud-dalston.html

SpringCloud中午API參考使用文檔2:https://springcloud.cc/spring-cloud-netflix.html

學SpringCloud能看懂上面的兩個使用文檔,都比你去花錢買書強!!

SpringCloud中國社區網:http://springcloud.cn/

SpirngCloud中文網:https://springcloud.cc/

使用SpringCloud的時候出現技術故障或者有使用疑問的都可以來這上面兩個網站來進行提問。


Rest微服務項目搭建:

項目介紹:以Dept部門模塊做一個微服務通用案例
Consumer消費者(Client)通過REST調用Provider提供者(Server)提供的服務

1.創建整體父工程:

1.在做案例之前,先在eclipse/IDEA裏面創建一個maven的整體父工程項目名爲:microservicecloud

備註:在創建整體父工程的時候Packaging要選擇pom而不是選擇jar

2.將需要用到的mavenjar包配置好

<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.hhf.springcloud</groupId>
	<artifactId>microservicecloud</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.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>

	<build>
		<finalName>microservicecloud</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<delimiters>
						<delimit>$</delimit>
					</delimiters>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

2.創建第一個子工程(公共子模塊)

3.創建好父工程並且將相應的maven配置好以後,開始創建第一個子工程的項目。

​ 1.在已經創建好的父工程下創建公共子模塊工程名爲:microservicecloud-api(maven Module)

備註:創建子工程時Packaging要選擇jar的打包方式。

​ 2.在子工程中添加mavenjar包

<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.hhf.springcloud</groupId>
		<artifactId>microservicecloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<!-- 當前Module我自己叫什麼名字 -->
	<artifactId>microservicecloud-api</artifactId>

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

4.然後在microservicecloud-api這個子項目的src/main/java下創建一個aip公共模塊名爲Dept的類,並且在這個類裏面添加以下代碼。

備註:如果無參/有參註解設置了,但最終如果無效的話,那就請用老辦法方式一個個方法搞出來吧!

//@AllArgsConstructor //全參構造註解
@Data	//set設置值/get獲取值註解
@NoArgsConstructor //無參數構造註解
@Accessors(chain=true) //鏈式訪問
public class Dept {
	//主鍵
	private Long deptno; 
	//部門名稱
	private String 	dname; 
	//來自那個數據庫,因爲微服務架構可以一個服務對應一個數據庫,同一個信息被存儲到不同數據庫。
	private String 	db_source;
	
	public Dept(String dname)
	{
		super();
		this.dname = dname;
	}

5.編寫完以上代碼以後,在microservicecloud-api這個子項目右鍵點擊Run As裏面列表下的maven clean和maven install,讓我們的工程重新在本地庫生成最新的jar包使其給其他模塊引用,達到通用之目的。

3.創建第二個子工程(部門微服務提供者)

6.我們在父項目microservicecloud中再創建一個maven的module名爲:microservicecloud-provider-dept-8001

1.這個microservicecloud-provider-dept-8001用來做部門服務提供者

2.在microservicecloud-provider-dept-8001這個項目的pom文件中加入以下jar包:

<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.hhf.springcloud</groupId>
		<artifactId>microservicecloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

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

	<dependencies>
		<!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
		<dependency>
			<groupId>com.hhf.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>
		<!-- 將微服務provider側註冊進eureka -->
		<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>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>
		<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>
		<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>

6.然後在microservicecloud-provider-dept-8001這個項目的resources文件下創建一個application.yml文件

將如下代碼添加到application.yml中

server:
  port: 8001
  
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路徑
  type-aliases-package: com.hhf.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: 520hhf
    dbcp2:
      min-idle: 5                                           # 數據庫連接池的最小維持連接數
      initial-size: 5                                       # 初始化連接數
      max-total: 5                                          # 最大連接數
      max-wait-millis: 200                                  # 等待連接獲取的最大超時時間

7.然後在resources文件夾裏再創建一個mybatis文件夾,在mybatis文件夾裏面創建一個mybatis.cfg.xml文件。

8.在mysql中創建部門數據庫腳本

​ 備註:得提前在mysql中創建好cloudDB01這個庫

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

9.然後在microservicecloud-provider-dept-8001這個項目下的dao包下創建一個dao接口名爲:DeptDao

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

import java.util.List;
//整合mybatis
@Mapper
public interface DeptDao {

    public boolean addDept(Dept dept);

    public Dept findById(Long id);

    public List<Dept> findAll();
}

10.然後在從resources文件夾裏再mybatis文件夾裏面再創建一個mapper文件夾,並在mapper文件夾下創建DeptMapper.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="com.hhf.springcloud.dao.DeptDao">

	<select id="findById" resultType="Dept" parameterType="Long">
		select deptno,dname,db_source from dept where deptno=#{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>

11.然後在service包下創建DeptService部門服務接口類

package com.hhf.springcloud.service;

import com.hhf.springcloud.entities.Dept;

import java.util.List;

public interface DeptService {
    public boolean add(Dept dept);
    public Dept  get(Long id);
    public List<Dept> list();
}

12.當然,有了創建DeptService部門服務接口,肯定也要有它的實現類,那麼在service包下在創建一個包名爲:impl,在這個impl包下創建DeptServiceimpl實現類

package com.hhf.springcloud.service.impl;

import com.hhf.springcloud.dao.DeptDao;
import com.hhf.springcloud.entities.Dept;
import com.hhf.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 dao;

    @Override
    public boolean add(Dept dept)
    {
        return dao.addDept(dept);
    }

    @Override
    public Dept get(Long id)
    {
        return dao.findById(id);
    }

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

}

13.好,接下來我們在controller包下創建一個DeptController的類來實現頁面數據顯示

package com.hhf.springcloud.controller;

import com.hhf.springcloud.entities.Dept;
import com.hhf.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 service;

    @RequestMapping(value="/dept/add",method=RequestMethod.POST)
    public boolean add(@RequestBody Dept dept)
    {
        return service.add(dept);
    }

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

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

14.接下來我們進入一個測試階段,看看能不能把數據顯示到頁面中

在主包下創建一個名爲:DeptProvider8001_App的啓動類進行測試

package com.hhf.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);
    }
}

15.好,激動人心的時刻到來了!如果無誤,那麼我們從數據庫讀取的數據能夠全部在頁面中進行一個顯示。

在瀏覽器輸入:http://localhost:8001/dept/list 進行頁面測試!

測試效果圖:

4.創建第三個子工程(部門微服務消費者)

1.在整體父工程下再創建一個子工程,名爲:microservicecloud-consumer-dept-80

2.在microservicecloud-consumer-dept-80子工程pom文件下添加jar包

<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.hhf.springcloud</groupId>
        <artifactId>microservicecloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>microservicecloud-consumer-dept-80</artifactId>
    <description>部門微服務消費者</description>

    <dependencies>
        <dependency>
          <!-- 自己定義的api -->
            <groupId>com.hhf.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>

3.然後在resources資源文件下創建一個application.yml文件,並添加如下內容:

server:
  port: 80

4.然後在java包下創建一個com.hhf.springcloud.cfgbeans包,並在此包創建一個ConfigBean類

package com.hhf.springcloud.cfgbeans;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {
	/**
     * RestTemplate提供了多種便捷訪問遠程Http服務的方法,
     * 是一種簡單便捷的訪問restful服務模板類,是Spring提供的用於訪問Rest服務的客戶端模板工具集。
     */
  
    @Bean
    public RestTemplate getRestTemplate(){
            return new RestTemplate();
    }

}

5.並在com.hhf.springcloud包下創建一個controller包,在controller包下創建一個名爲:DeptController_Consumer的類

package com.hhf.springcloud.controller;

import com.hhf.springcloud.entities.Dept;
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 java.util.List;

@RestController
public class DeptController_Consumer {

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

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

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

6.創建一個主啓動類名爲:DeptConsumer80_App

package com.hhf.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);
    }
}

7.激動人心的時候又到啦!!!

​ 我們先啓動microservicecloud-provider-dept-8001這個子工程下的主啓動類:DeptProvider8001_App。

8.啓動了DeptProvider8001_App成功以後,我們再啓動microservicecloud-consumer-dept-80這個子工程下的主啓動類:DeptConsumer80_App

9.然後在瀏覽器中進行測試:

​ 1).在瀏覽器輸入:http://localhost/consumer/dept/get/2


​ 2).在瀏覽器輸入:http://localhost/consumer/dept/add?dname=AI
A

​ 3).然後查看你自己的mysql數據庫裏面有沒有添加到AI這個數據

​ 4).然後我們最後來看看瀏覽器中會不會顯示我們新添加的數據

​ 在瀏覽器輸入:http://localhost/consumer/dept/list

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