1. 程式人生 > >Spring Cloud服務提供者與服務消費者怎麼運作的?

Spring Cloud服務提供者與服務消費者怎麼運作的?

微服務中最基本最基本的兩個角色是服務提供者與服務消費者。

之前所有程式碼都在同一個框架的時候,比如Controller呼叫Service的,直接注入Service bean即可進行呼叫了。現在做成微服務之後,那麼我們就需要有一個工程專門提供相應的服務功能,對應的有相應的工程消費這個功能,這就是服務提供者和服務消費者最基本的概念。

目錄大綱:

(1)服務提供者與服務消費者概念
(2)編碼思路
(3)服務提供者編碼
(4)服務消費者編碼
(5)存在問題

接下來看下具體的內容:

(1)服務提供者與服務消費者概念

服務提供者:服務的被呼叫方(即,為其他服務提供服務的服務);

服務消費者:服務的呼叫方(即,依賴其他服務的服務);

(2)編碼思路

這裡我們使用最基本的方式實現服務提供者和服務消費者。

(1)兩個專案,一個服務提供者,一個是服務消費者;

(2)服務提供者從記憶體資料庫H2中查詢資料,Controller進行呼叫獲取;

(3)服務消費者呼叫服務提供者的Controller進行獲取資料,然後返回給瀏覽器。

(3)服務提供者編碼

新建工程

新建一個提供使用者資訊的工程,取名為:microservie-provider-user

在pom.xml新增依賴包

Xml程式碼 

<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.kfit</groupId>  
    <artifactId>ms-provider-user</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
    <packaging>jar</packaging>  
   
    <name>ms-provider-user</name>  
    <url>http://maven.apache.org</url>  
   
    <!-- spring boot parent節點,引入這個之後,在下面和spring boot相關的就不需要引入版本了; -->  
    <parent>  
       <groupId>org.springframework.boot</groupId>  
       <artifactId>spring-boot-starter-parent</artifactId>  
       <version>1.4.1.RELEASE</version>  
    </parent>  
   
    <properties>  
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    </properties>  
   
    <dependencies>  
       <!-- web支援: 1、web mvc; 2、restful; 3、jackjson支援; 4、aop ........ -->  
       <dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-web</artifactId>  
       </dependency>  
   
       <!-- 記憶體資料庫h2 -->  
       <dependency>  
           <groupId>com.h2database</groupId>  
           <artifactId>h2</artifactId>  
           <scope>runtime</scope>  
       </dependency>  
   
       <!-- spring data jpa -->  
       <dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-data-jpa</artifactId>  
       </dependency>  
    </dependencies>  
</project>

在src/main/resources下新建schema.sql新增建表語句

建立了一張User表:

Sql程式碼  

drop table user if exists;  
create table user(  
    id bigint generated bydefaultas identity,  
    username varchar(40),  
    name varchar(20),  
    age int(3),  
    balance decimal(10,2),  
    primarykey(id)  
);

在src/main/resources/新建data.sql插入資料

在User表插入幾條資料進行測試:

Sql程式碼  

insert into user(id,username,name,age,balance) values(1,'user1','張三',20,100.00);  
insert into user(id,username,name,age,balance) values(2,'user2','李四',20,100.00);  
insert into user(id,username,name,age,balance) values(3,'user3','王五',20,100.00);  
insert into user(id,username,name,age,balance) values(4,'user4','趙六',20,100.00);

建立實體類User

Java程式碼  

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})  
@Entity  
public class User implements Serializable{  
    private static final long serialVersionUID = 1L;  
    @[email protected]  
    private long id; //主鍵.  
    private String username;//使用者名稱.  
    private String name; //姓名  
    private int age; //年齡.  
    private BigDecimal balance;//餘額.  
     
}

為什麼要加@JsonIgnoreProperties呢?

問題在於,使用load方法,您只需要一個代理,而不是真正的物件。代理物件沒有已經載入的屬性,所以當序列化發生時,沒有要序列化的屬性。使用get方法,您實際上可以獲得真正的物件,這個物件實際上可以被序列化。

建立Dao類UserRepository

Java程式碼  

public interface UserRepository extends JpaRepository<User,Long>{  
   
}

建立Service類UserService

Java程式碼

@Service  
public class UserService {  
     
    @Autowired  
    private UserRepository userRepository;  
     
    public User getById(longid){  
       return userRepository.getOne(id);  
    }  
}

建立Controller類UserController

Java程式碼  

@RestController  
public class UserController {  
    @Autowired  
    private UserService userService;  
     
    @GetMapping("/user/{id}")  
    public User getById(@PathVariablelongid){  
       User user = userService.getById(id);  
       System.out.println(user);  
       return user;  
    }  
}

在src/main/resources新建application.properties

主要是配置埠號和jpa配置:

Properties程式碼  

server.port=7900  
   
spring.jpa.generate-ddl=false  
spring.jpa.show-sql=true  
spring.jpa.hibernate.ddl-auto=none  
spring.datasource.platform=h2  
spring.datasource.schema=classpath:schema.sql  
spring.datasource.data=classpath:data.sql  
   
logging.level.root=INFO  
logging.level.org.hibernate=INFO

編寫啟動類

Java程式碼  

@SpringBootApplication  
public class App {  
    public staticv oid main(String[] args) {  
       SpringApplication.run(App.class, args);  
    }  
}

啟動App測試

{"id":1,"username":"user1","name":"張三","age":20,"balance":100.00}

到此服務提供者就編寫完畢了,這個程式碼沒有什麼特別之處,和我們常規程式碼編寫是一樣的!。

(4)服務消費者編碼

新建工程

新建一個服務消費者專案,取名為:microservice-consumer-movice

在pom.xml新增依賴包

Xml程式碼  

<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.kfit</groupId>  
  <artifactId>ms-consumer-movice</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>jar</packaging>  
   
  <name>ms-consumer-movice</name>  
  <url>http://maven.apache.org</url>  
   
    <!-- spring boot parent節點,引入這個之後,在下面和spring boot相關的就不需要引入版本了; -->  
    <parent>  
       <groupId>org.springframework.boot</groupId>  
       <artifactId>spring-boot-starter-parent</artifactId>  
       <version>1.5.8.RELEASE</version>  
    </parent>  
   
   
  <properties>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  </properties>  
   
  <dependencies>  
     <!-- web支援: 1、web mvc; 2、restful; 3、jackjson支援; 4、aop ........ -->  
    <dependency>  
       <groupId>org.springframework.boot</groupId>  
       <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
  </dependencies>  
</project>

新建實體類User

Java程式碼  

public class User implements Serializable{  
    private static final longserialVersionUID = 1L;  
    private long id; //主鍵.  
    private String username;//使用者名稱.  
    private String name; //姓名  
    private int age; //年齡.  
    private BigDecimal balance;//餘額.  
     
}

新建Controller類MoviceController

Java程式碼  

@RestController  
public class MoviceController {  
     
    @Autowired  
    private RestTemplate restTemplate;  
     
    @GetMapping("/user/{id}")  
    public User getById(longid){  
       String url = "http://127.0.0.1:7900/user/"+id;  
       return restTemplate.getForObject(url, User.class);  
    }  
}

在src/main/resources新建application.properties

這裡只配置了埠號:

server.port=7901

新建啟動類App.java

Java程式碼  

@SpringBootApplication  
public class App {  
     
    @Bean  
    public RestTemplate restTemplate(){  
       returnnew RestTemplate();  
    }  
     
    publicstaticvoid main(String[] args) {  
       SpringApplication.run(App.class, args);  
    }  
}

這裡將RestTemplate進行初始化,交給Spring進行管理。

啟動測試

{"id":2,"username":"user2","name":"李四","age":20,"balance":100.00}

(5)存在問題

 該例子簡單易理解,但是存在很多的問題,比如:

(1)請求地址(http://127.0.0.1:7900/user/)硬編碼了;

(2)當有多個提供者節點的時候,怎麼進行負載,基本想法可以在提供者和消費者中間加一個反向代理,但是服務太多的時候不利於管理。

相關推薦

Spring Cloud服務提供者服務消費者怎麼運作的?

在微服務中最基本最基本的兩個角色是服務提供者與服務消費者。 之前所有程式碼都在同一個框架的時候,比如Controller呼叫Service的,直接注入Service bean即可進行呼叫了。現在做成微服務之後,那麼我們就需要有一個工程專門提供相應的服務功能,對應的有相

spring cloud feign 服務提供者服務消費者引數名不一致,會接收不到

最近sprign cloud專案中遇到了一個坑,和大家分享一下 服務消費者程式碼如下,引數名稱為currentDate, 服務提供者程式碼如下,引數名稱為date, 由於兩個引數名稱不一樣,呼叫過程中,服務提供方始終獲取不到呼叫引數的值,花費了很長時間才找到了這

SpringCloud---(2)服務提供者服務消費者

服務提供者:是指服務的被呼叫方(即:為其它服務提供服務的服務)。 服務消費者:是指服務的呼叫方(即:依賴其它服務的服務)。   服務提供者  pom.xml <?xml version="1.0" encoding="UTF-8"?> <

spring cloud服務架構 服務提供者服務消費者

服務 lee 名詞 mave into gin tag bigint snap 服務提供者和服務消費者 下面這張表格,簡單描述了服務提供者/消費者是什麽: | 名詞 | 概念 | | ----- | ---------

記一次Spring Cloud負載均衡時服務提供者使用fastjson,服務消費者請求時出現的異常

服務消費者出現的異常:2018-05-22 17:33:16.605  INFO 6160 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints

Spring Cloud 入門教程 - Eureka服務註冊發現

spring spring cloud spring cloud eureka spring boot 簡介 在微服務中,服務註冊與發現對管理各個微服務子系統起著關鍵作用。隨著系統水平擴展的越來越多,系統拆分為微服務的數量也會相應增加,那麽管理和獲取這些微服務的URL就會變得十分棘手,如果我們

Spring Cloud入門程序——註冊服務提供者

ann disco align prope not -a out net col 1、創建Spring Starter project 2、引入依賴 點擊finish 3、創建啟動類 package com.hello; import org.spri

spring-cloud(三)服務消費者(Feign)(Finchley版本)

Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。Feign預設集成了Ribbon,並和Eureka結合,預設實現了負載均衡的效

spring-cloud(二)服務消費者(rest+ribbon)(Finchley版本)

在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是ribbon+restTemplate,另一種是feign ribbon是一個負載均衡客戶端,可以很好的控制http和tcp的一些行為。Feign預

spring-cloud(一)服務的註冊發現Eureka(Finchley版本)

spring cloud 為開發人員提供了快速構建分散式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件匯流排、全域性鎖、決策競選、分散式會話等等。它執行環境簡單,可以在開發人員的電腦上跑。另外說明spring cloud是基於springboot的,所以需要開發中對springb

spring cloud(二、服務消費者

一、ribbon(service-ribbon) 新建一個spring cloud專案 在啟動類加上@EnableDiscoveryClient註解,向服務中心註冊 @EnableDiscoveryClient @SpringBootApplication public cla

Spring Cloud-02服務發現服務註冊Eureka + Eureka Server的搭建

文章目錄 服務發現元件概述 Eureka概述 Eureka原理 Maven父子工程的搭建 Eureka Server的搭建 新建 Maven Module 新增spring-cloud-starter-eureka-s

spring cloud (三、服務提供者demo_provider)

       spring cloud (一、服務註冊demo_eureka)          spring cloud (二、服務註冊安全demo_eureka)    

Spring Cloud(三)服務註冊發現

Spring Cloud(三)服務註冊與發現 案例中有三個角色:服務註冊中心、服務提供者、服務消費者,其中服務註冊中心就是eureka單機版啟動既可,流程是首先啟動註冊中心,服務提供者生產服務並註冊到服務中心中,消費者從服務中心中獲取服務並執行。 這裡新建兩個spring boo

Spring cloud 中 jersey fastjson 某些版本衝突導致服務無法啟動的問題

2018-08-30 06:53:23.146 ERROR 1 --- [ main] o.s.c.n.e.s.EurekaRegistration : error getting CloudEurekaClient org.springframewor

Spring Cloud 學習筆記二(服務發現消費)

配置高可用註冊中心 Eureka Server 的高可用就是指將服務註冊中心本身向其他服務註冊中心註冊自己,這樣就可以實現服務清單的同步,增強系統可用性,而不是單節點的服務註冊中心。 在學習筆記一里,我們設定過如下兩個引數 eureka.client.regis

【夯實Spring CloudSpring Cloud中的Eureka服務註冊發現詳解

本文屬於【夯實Spring Cloud】系列文章,該系列旨在用通俗易懂的語言,帶大家瞭解和學習Spring Cloud技術,希望能給讀者帶來一些乾貨。系列目錄如下: 【夯實Spring Cloud】Dubbo沉睡5年,Spring Cloud開始崛起! 【夯實Spring C

Spring Cloud入門:服務註冊服務發現

文章例項使用的Spring Cloud版本為Finchley.SR1,Spring Boot版本為2.0.4。 1 Spring Cloud Eureka(服務註冊與發現) Spring Cloud Eureka 是Spring Cloud Netflix專案下的服務治

Spring Cloud學習筆記(三)——服務發現消費之使用Ribbon

服務消費一般使用ribbon和feign兩種方式。而feign實際上也是以ribbon為基礎的。有多個服務提供者例項的情況下ribbon可以實現負載均衡。 1.pom檔案:這裡與服務提供者不同的是需要引入ribbon包。 <dependency>

Spring Cloud學習筆記(四)——服務發現消費之使用Feign

Feign 是一個宣告web服務客戶端,這便得編寫web服務客戶端更容易,使用Feign 建立一個介面並對它進行註解,它具有可插拔的註解支援包括Feign註解與JAX-RS註解,Feign還支援可插拔的編碼器與解碼器,Spring Cloud 增加了對 Spring MVC的