淺談SpringCloud (一) 什么是微服務和不使用SpringCloud怎么訪問服務提供者


微服務和SpringCloud介紹

1.什么是微服務?

看過一遍介紹的很清楚的博客:https://blog.csdn.net/wuxiaobingandbob/article/details/78642020

微服務得從兩個方面去理解,什么是"微"、什么是"服務"。

:狹義來講就是體積小、著名的"2 pizza 團隊"很好的詮釋了這一解釋(2個披薩 團隊最早是亞馬遜 CEO Bezos提出來的,意思是說單個服務的設計,所有參與人從設計、開發、測試、運維所有人加起來 只需要2個披薩就夠了 )。

服務:一定要區別於系統,服務一個或者一組相對較小且獨立的功能單元,是用戶可以感知最小功能集。

2.為什么要使用微服務

在傳統的IT行業軟件大多都是各種獨立系統的堆砌,這些系統的問題總結來說就是擴展性差,可靠性不高,維護成本高。到后面引入了SOA服務化,但是,由於 SOA 早期均使用了總線模式,這種總線模式是與某種技術棧強綁定的,比如:J2EE。這導致很多企業的遺留系統很難對接,切換時間太長,成本太高,新系統穩定性的收斂也需要一些時間。最終 SOA 看起來很美,但卻成為了企業級奢侈品,中小公司都望而生畏。

3.微服務的開發框架

目前微服務的開發框架,最常用的有以下四個:

  1. Spring Cloud:http://projects.spring.io/spring-cloud(現在非常流行的微服務架構)

  2. Dubbo:http://dubbo.io

  3. Dropwizard:http://www.dropwizard.io (關注單個微服務的開發)

  4. Consul、etcd&etc.(微服務的模塊)

4.什么是SpirngCloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring並沒有重復制造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。

5.Spring、SpringCloud和SpringBoot的關系

Spring Boot可以離開Spring Cloud獨立使用開發項目,但是Spring Cloud離不開Spring Boot,屬於依賴的關系。

  spring -> spring boot > Spring Cloud 這樣的關系。

普通的兩個程序直接的訪問

使用IDEA開發工具。

1.新建一個maven的父工程 ,並創建提供者工程和消費者工程。

 2.將項目設置成springBoot項目,並添加對應的依賴。

  • 設置parent項目的pom.xml
  • <?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>com.aomeibox</groupId>
        <artifactId>springclouddemo</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>provider-user</module>
            <module>customer-order</module>
        </modules>
    
        <!-- 設置成springBoot項目 -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.9.RELEASE</version>
        </parent>
    
        <!-- SpringBoot依賴 -->
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </dependency>
    
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </dependency>
    
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
  • 設置提供者,設置成web工程,並且添加controller類和yml配置文件,端口和名稱修改,防止端口被占用。設置一個user對象,屬性和provider中相同
 1 /**
 2  * Created by leo on 2018/12/24.
 3  */
 4 @RestController
 5 public class UserController {
 6 
 7     @GetMapping("/user/{id}")
 8     public User getUser(@PathVariable Integer id){
 9         return new User(id);
10     }
11 }

 

server:
  port: 7900 #程序啟動后的端口

spring:
  application:
    name: provider-user #應用名稱

 

  • 設置消費者,也需要設置成web工程,並且添加controller類和yml配置文件。設置一個user對象,屬性自己設置即可。
@SpringBootApplication
public class CustomerOrder
{

    @Bean //相當於xml的bean標簽,主要用於調用當前方法獲取到指定對象
    public RestTemplate template(){
        return new RestTemplate();
    }

    public static void main( String[] args )
    {
        SpringApplication.run(CustomerOrder.class);
    }
}
@RestController
public class OrderController {

    @Autowired
    private RestTemplate template;//spring提供的一個用於訪問rest接口的模板對象
    private String url = "http://localhots:7900/user/";

    @GetMapping("/order/{id}")
    public User getUser(@PathVariable Integer id){
        //訪問提供者獲取數據
        User user = template.getForObject(url + id, User.class);//通過訪問rest 獲取到json數據,然后轉換成User對象

        return user;
    }
}

 

這樣就可以通過一個消費者,去訪問服務提供者獲得數據。(未使用springcloud)。

 


免責聲明!

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



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