什麼是SpringCloud?
springCloud ,基于springBoot 提供了一套微服務解決方案,包括服務注冊與發現,配置中心全鍊路監控,服務網關,負載均衡,熔斷器等元件,除了基于netFlix 的開源元件做高度抽象封裝之外,還有一些選型中立的開源元件
SpringCloud 利用SpringBoot 的開發便利性,巧妙地簡化了分布式系統基礎實施開發,SpringCloud 為開發人員提供了快速建構分布式系統的一些工具,包括配置管理,服務發現,斷路器,路由,微代理,實際總線,全局鎖,決策競選,分布式會話等,都可以用Springboot 的開發風格做到一鍵啟動和部署
SpringBoot 并沒有重複造輪子,它隻是将目前各家公司開發的比較成熟,經得起實際考驗的服務架構組合起來,通過SpringBoot 風格再封裝,屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂,易部署和易維護的分布式系統開發工具包
SpringCloud 是分布式微服務結構下的一站式解決方案,是各個微服務架構落地技術的集合體,俗稱微服務全家桶。
SpringCloud 和SpringBoot 關系
Springboot 專注快速友善的開發單個個體微服務
SpringCloud 是關注全局的微服務協調整理治理架構,它将Springboot 開發的一個個單體微服務整合并管理起來,為各個微服務之間提供:配置管理,服務發現,斷路器,路由,微代理,事件總線,全局鎖,決策競選分布式會話等等內建服務。
SpringBoot 可以離開Springboot 獨立使用,開發項目,但是SpringCloud 離不開Springboot,屬于依賴關系
Springboot 專注于快速,友善的開發個個體微服務,SpringCloud 關注全局的服務治理架構
Dubbo 和SpringCloud 對比

最大差別: SpringCloud抛棄 了Dubbo的RPC通信,采用的是基于HTTP的REST方式。
嚴格來說,這兩種方式各有優劣。雖然從- -定程度上來說,後者犧牲了服務調用的性能,但也避免了上面提到的原
生RPC帶來的問題。而且REST相比RPC更為靈活, 服務提供方和調用方的依賴隻依靠- -紙契約, 不存在代碼級别的
強依賴,這在強調快速演化的微服務環境下,顯得更加合适。
品牌機與組裝機的差別
很明顯,Spring Cloud的功能比DUBBO更加強大,涵蓋面更廣,而且作為Spring的拳頭項目,它也能夠與Spring
Framework、Spring Boot、Spring Data、Spring Batch等其他Spring項目完美融合,這些對于微服務而言是至
關重要的。使用Dubbo建構的微服務架構就像組裝電腦,各環節我們的選擇自由度很高,但是最終結果很有可能
因為一條記憶體品質不行就點不亮了,總是讓人不怎麼放心,但是如果你是一名高手, 那這些都不是問題;而Spring
Cloud就像品牌機,在Spring Source的整合下,做了大量的相容性測試,保證了機器擁有更高的穩定性,但是如
果要在使用非原裝元件外的東西,就需要對其基礎有足夠的了解。
社群支援與更新力度
最為重要的是,DUBBO停止了5年左右的更新,雖然2017.7重新開機了。 對于技術發展的新需求,需要由開發者自行
拓展更新(比如當當網弄出了DubboX),這對于很 多想要采用微服務架構的中小軟體組織,顯然是不太合适的,
中小公司沒有這麼強大的技術能力去修改Dubbo源碼+周邊的一整套解決方案, 并不是每一個公司都有阿裡的大牛
+真實的線上生産環境測試過。
在沒有使用 微服務開發的時候我們得傳統得網站
總結:
曾風靡國内的開源RPC服務架構Dubbo在重新開機維護後,令許多使用者為之雀躍,但同時,也迎來了一些質疑的聲
音。網際網路技術發展迅速, Dubbo是否還能跟上時代? Dubbo與Spring Cloud相比又有何優勢和差異?是否會
有相關舉措保證Dubbo的後續更新頻率?
人物: Dubbo重新開機維護開發的劉軍,主要負責人之一
劉軍,阿裡巴巴中間件進階研發工程師,主導了Dubbo重新開機維護以後的幾個發版計劃,專注于高性能RPC架構
Rest學習之環境搭建案例
建立一個maven 得父工程
導入父工程得依賴
<?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>
<groupId>org.example</groupId>
<artifactId>SpringCloud</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式-->
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<springboot.version>2.3.4.RELEASE</springboot.version>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<mysql.version>8.0.21</mysql.version>
<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>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 下面三個基本是微服務架構的标配 -->
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿裡巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<!-- druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目錄-->
<includes><!--包括目錄下的.properties,.xml檔案都會掃描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
建立第一個子子產品 Springcloud-api 得
導入Springcloud-api 得依賴
<?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">
<parent>
<artifactId>SpringCloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>SpringCloud-api</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
實體類
在我們得api 裡寫我們得實體類
package com.jj.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author fjj
* @date 2021/4/16 17:06
*/
@Data
@NoArgsConstructor
@Accessors(chain = true) //鍊式寫法
public class Dept implements Serializable {
//dept 得實體類
private Long deptno;
private String dname;
private String db_source;
public Dept(String dname) {
this.dname = dname;
}
}
建立我們得dept 服務者得子產品
導入依賴 pom.xm
<?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">
<parent>
<artifactId>SpringCloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-provider-dept-8001</artifactId>
<dependencies>
<!-- 拿到需要得實體類,是以要配置api module-->
<dependency>
<groupId>org.example</groupId>
<artifactId>SpringCloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</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-test</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-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
編寫我們服務者得 三層架構
yml 得配置
server:
port: 8001
#mybatis 配置
mybatis:
type-aliases-package: com.jj.pojo
# config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring 得配置
spring:
application:
name: springcloud-proviser-dept-8001springcloud-proviser-dept
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
mapper 類
package com.jj.mapper;
import com.jj.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author fjj
* @date 2021/2/20 18:25
*/
@Mapper
@Repository
public interface Deptmapper {
//添加
public boolean adddept(Dept dept);
//通過id 查詢
public Dept querybyid(int id);
//全查
public List<Dept> queryall();
}
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="com.jj.mapper.Deptmapper">
<!-- 添加-->
<insert id="adddept" parameterType="Dept">
insert into dept(dname,db_source)
values (#{dname},DATABASE())
</insert>
<!-- 通過id查詢-->
<select id="querybyid" resultType="Dept" parameterType="int">
select * from dept where deptno =#{deptno}
</select>
<!-- 全查-->
<select id="queryall" resultType="Dept">
select * from dept
</select>
</mapper>
service 層
package com.jj.service;
import com.jj.mapper.Deptmapper;
import com.jj.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author fjj
* @date 2021/2/20 18:31
*/
@Service
public class Deptserviceimpl implements Deptservice {
//注入
@Autowired
Deptmapper deptmapper;
@Override
public boolean adddept(Dept dept) {
return deptmapper.adddept(dept);
}
@Override
public Dept querybyid(int id) {
return deptmapper.querybyid(id);
}
@Override
public List<Dept> queryall() {
return deptmapper.queryall();
}
}
控制層
package com.jj.Controller;
import com.jj.pojo.Dept;
import com.jj.service.Deptserviceimpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author fjj
* @date 2021/2/20 18:35
*/
@RestController
public class DeptController {
//注入
@Autowired
private Deptserviceimpl deptserviceimpl;
//添加
@GetMapping("/dept/add")
public boolean addDept(Dept dept){
return deptserviceimpl.adddept(dept);
}
//通過id 擷取
@GetMapping("/dept/get/{id}")
public Dept get(@PathVariable("id") int id){
return deptserviceimpl.querybyid(id);
}
//全查
@GetMapping("/dept/list")
public List<Dept> queryAll(){
return deptserviceimpl.queryall();
}
}
結果
添加
通過id 查詢
全查
建立消費者得子產品
導入我們消費者需要得依賴
<?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">
<parent>
<artifactId>SpringCloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-dept-80</artifactId>
<dependencies>
<!-- 拿到我們得實體類-->
<!-- 拿到需要得實體類,是以要配置api module-->
<dependency>
<groupId>org.example</groupId>
<artifactId>SpringCloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
**注入我們消費者得config **
消費者代碼
寫config 把注入到我們
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author fjj
* @date 2021/4/19 11:07
*/
@Configuration
public class RestConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
控制層
package com.jj.demo.controller;
import com.jj.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
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.awt.*;
import java.util.List;
/**
* @author fjj
* @date 2021/2/21 17:03
*/
@RestController
public class DeptConsumer {
//注入rest 模闆
@Autowired
private RestTemplate rtstTemplate;
//url
private static final String url="http://localhost:8001";
//全查
@RequestMapping("/consumer/dept/list")
public List<Dept> list(){
return rtstTemplate.getForObject(url+"/dept/list",List.class);
}
//通過id
@RequestMapping("consumer/dept/get/{id}")
public Dept getid(@PathVariable("id") int id){
return rtstTemplate.getForObject(url+"dept/get/"+id,Dept.class);
}
}
效果