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 Cloud】Spring 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的