天天看點

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

什麼是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 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

最大差別: 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源碼+周邊的一整套解決方案, 并不是每一個公司都有阿裡的大牛

+真實的線上生産環境測試過。

在沒有使用 微服務開發的時候我們得傳統得網站

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

總結:

曾風靡國内的開源RPC服務架構Dubbo在重新開機維護後,令許多使用者為之雀躍,但同時,也迎來了一些質疑的聲

音。網際網路技術發展迅速, Dubbo是否還能跟上時代? Dubbo與Spring Cloud相比又有何優勢和差異?是否會

有相關舉措保證Dubbo的後續更新頻率?

人物: Dubbo重新開機維護開發的劉軍,主要負責人之一

劉軍,阿裡巴巴中間件進階研發工程師,主導了Dubbo重新開機維護以後的幾個發版計劃,專注于高性能RPC架構

Rest學習之環境搭建案例

建立一個maven 得父工程

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

導入父工程得依賴

<?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 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

導入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>
      

實體類

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

在我們得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 服務者得子產品

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

導入依賴 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();
    }
}
      

結果

添加

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)
springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

通過id 查詢

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

全查

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

建立消費者得子產品

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)

導入我們消費者需要得依賴

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

效果

springCloud 學習第一篇(介紹以及Rest 學習:服務者 與消費者 環境搭建)