springCloud學習【一】:服務的注冊發現與消費【實例】
標簽: springCloud學習 Java學習之路 spring boot cloud 后端 spring
springCloud之微服務的注冊發現與消費
- `個人學習記錄而已,沒事就回來看看,給自己漲記性`
- 準備:新建一個空的maven項目用來當父項目【CloudDemo】我就是拿他當個根目錄而已
- `未完待續——如果看到這里了,(●'?'●)該去點贊了啊喂`
個人學習記錄而已,沒事就回來看看,給自己漲記性
不做名詞解釋,各種名詞解釋百度一堆堆
文章總結寫在末尾點個贊鼓勵一下?
文章有點長,目錄是個好東西啊
哪里不對留言討論,拜托描述清楚
廢話連篇:凡心所向,素履所往;
準備:新建一個空的maven項目用來當父項目【CloudDemo】我就是拿他當個根目錄而已
一、項目準備:CloudDemo僅當作父項目使用【各個項目的根目錄而已】
1、刪除沒用的東西
2、maven配置
3、編譯jdk設置
4、項目編碼設置
二、創建注冊中心模塊cloud-registry
SpringBoot項目
注冊中心選擇的eureka Server 其他的依賴 個人習慣dev和lombok 然后一路下一步完成
完整項目結構:
cloud-registry
-pom.xml內容【默認最新的springCloud版本,Hoxton.SR8】
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.crazy</groupId>
<artifactId>cloud-registry</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-registry</name>
<description>注冊中心模塊</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
項目依賴
三、注冊中心的配置【yml格式】
server:
port: 8770 #端口
application:
name: Eureka-Registry #當前模塊項目的服務名稱
eureka:
client:
register-with-eureka: false #是否將自己注冊到Eureka Server
fetch-registry: false #是否從Eureka Server獲取注冊信息
service-url:
defaultZone: http://localhost:${server.port}/eureka/ #當前注冊中心的地址,其他的服務需要注冊到這里
啟動類增加Eureka的配置注解 @EnableEurekaServer
注解解釋 :**eureka的服務器配置
四、搞定,注冊中心就這么就沒球了,啟動點個贊鼓勵一下?
訪問路徑localhost:8770即可打開Eureka的管理界面
【直接IP:端口就可以,不用加/eureka】
后面注冊進來的服務會在
Instances currently registered with Eureka展示
五、去搞一個服務cloud-service
【服務提供者】注冊到eureka中,SpringBoot項目
還是新建一個moudle,依賴選擇Eureka Discovery Client
pom.xml內容
添加了web依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.crazy</groupId>
<artifactId>cloud-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-service</name>
<description>服務提供者,只提供接口服務</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
六、服務提供者service的配置
server:
port: 8771 #設置服務提供者的端口號
eureka:
client:
service-url:
defaultZone: http://localhost:8770/eureka/ #注冊到那里的注冊中心
spring:
application:
name: Eureka-Service #這個項目模塊所提供服務的名稱
在啟動類上添加注解 @EnableEurekaClient
這里有點迷,最后的總結里面有說明
七、依次啟動
先啟動registry 然后再啟動 service
再次打開Eureka的管理界面localhost:8770
可以發現服務提供者已經注冊到注冊中心了
點個贊鼓勵一下?
八、服務注冊了, 提供兩個接口用來消費(調用)
給他提供兩個最簡單的服務接口
1、接收一個參數返回一個字符串
2、接收一個參數返回一個實體
啟動類同級創建包,然后就是web開發的路子controller和service和mapper和pojo(moudle,entity)實體層和工具啊配置啊啥的各種包路徑
package com.crazy.controller;
import com.crazy.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description 提供兩個簡單的服務
* @Author Crazy
* @Date 2020/10/10 14:52
* @Copyright
*/
@RestController
@RequestMapping("/test")
public class TestController {
/**
* 接口服務一
*/
@RequestMapping("/string")
public String hello(String str) {
System.out.println(">>>>>>進入/test/string>>>>>>傳入的值:" + str );
//service層和impl以及mapper層略過
return "你好:" + str;
}
/**
* 接口服務二
*/
@RequestMapping("/getUser")
public User getUser() {
System.out.println(">>>>>>進入/test/getUser");
//service層和impl以及mapper層略過
User u = new User();
u.setId(1);
u.setUserName("瘋瘋顛顛");
u.setPassword("Crazy123");
return u;
}
}
重新啟動cloud-service
測試
測試:編碼也好,瀏覽器也好,我用的postman
九、搞定,在弄個服務消費者cloud-consume
SpringBoot項目
新建一個模塊moudle【服務消費者cloud-consume】
依賴如下
項目配置文件
server:
port: 8772 #設置服務提供者的端口號
eureka:
client:
service-url:
defaultZone: http://localhost:8770/eureka/ #注冊到那里的注冊中心
spring:
application:
name: Eureka-Consume #這個項目模塊所提供服務的名稱
服務消費調用的方式有很多點個贊鼓勵一下?
1、第一種直接調用 不經過注冊中心
需要一個RestTemplate的客戶端
源碼解釋為客戶端負載均衡器
package com.crazy.beans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @Description TODO
* @Author Crazy
* @Date 2020/10/10 15:35
* @Copyright
*/
@Configuration
public class Beans {
@Bean
@LoadBalanced //標記一個RestTemplate為客戶端負載均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller直接調用的,沒有走本模塊的service以及mapper層
package com.crazy.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Description 消費者調用服務Demo
* @Author Crazy
* @Date 2020/10/10 15:14
* @Copyright
*/
@RestController
@RequestMapping("/consume")
public class ConsumeController {
/**
* 第一種消費調用服務的方式
*/
@RequestMapping("/one")
public String helloWorld(String s) {
System.out.println("進入/consume/one>>>>>>傳入的值為:" + s);
String One = new RestTemplate().getForObject("http://localhost:8771/test/string?str=" + s, String.class);
System.out.println("第一種>>>>>>:"+One);
return ">>>>>>調用返回的是:"+One;
}
}
啟動cloud-consume項目
消費者也到注冊中心了
測試
消費者控制臺打印的信息
服務提供者控制臺打印的信息
調用實體返回值
這里只在控制臺打印,沒有返回實體
打印信息
2、第二種消費方式【根據服務名 獲取服務列表 訪問某個服務的網絡位置】
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 第二種消費調用服務方式:根據服務名 獲取服務列表 并訪問某個服務的網絡位置。
*/
@RequestMapping("/two")
public String helloTwo(String s){
System.out.println("進入/consume/two>>>>>>傳入的值為:" + s);
RestTemplate restTemplate = new RestTemplate();
//獲取服務信息
ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
String Two = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/test/string?str="+s,String.class);
//getForObject也可以返回實體數據 區別:直接返回請求的body里面的實體
User user = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/test/getUser?str=" + s, User.class);
System.out.println(">>>>>>調用返回的實體數據:" + user.toString());
return ">>>>>>調用返回的是:" + Two;
}
測試
控制臺信息
3、第三種Ribbon+restTemplate注入
的方式
控制層
service層
service實現層
執行調用消費服務
service實現層代碼
package com.crazy.service.impl;
import com.crazy.pojo.User;
import com.crazy.service.ConsumeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* @Description TODO
* @Author Crazy
* @Date 2020/10/10
* @Copyright
*/
@Service
public class ConsumeServiceImpl implements ConsumeService {
@Autowired
private RestTemplate rest;
@Override
public String testResult(String s) {
//restTemplate的對GET請求進行調用的兩種請求方式 一
String str = rest.getForObject("http://EUREKA-SERVICE/test/string?str={1}", String.class,s);
//restTemplate的對GET請求進行調用的兩種請求方式 二 上面的方式也可以響應為實體
ResponseEntity<User> forEntity = rest.getForEntity("http://EUREKA-SERVICE/test/getUser", User.class);
System.out.println(">>>>>>測試getForEntity返回值:"+forEntity.getBody());
//其他還有POST的各種API以后慢慢測試
return str;
}
}
測試
控制臺打印信息
beans
也可以直接寫道啟動類中加載
十、復制幾個服務實現調用
注冊中心現有的服務有
兩個,一個服務提供者,一個服務消費者。多搞幾個服務提供者玩玩?
服務層增加點東西,打印一下,每個服務的端口信息
然后把服務多復制兩個出來通過VM命令改一下端口
選中service直接復制
點擊復制出來的服務Environment 分別去修改這兩個復制出來的服務的端口號 -Dserver.port=8773
這里一個8773一個8774
現有的端口號
8770 注冊中心
8771 服務提供者
8772 服務消費者
8773-8774是復制出來的兩個服務提供者
完了之后點擊-應用-OK
服務全部重啟:順序 registry-service-service01-service-02-consume 也就是一個注冊中心,三個服務提供者,一個服務消費者
eureka管理界面中顯示service服務有三個了,端口分別是8774-8771-8773 但是名字一樣
再來測試消費的方式123,就3吧
控制臺信息
three的請求,方法內部調用了兩次服務,一次進了8774,一次進了8773,8773沒有打印,所以頁面只顯示8774,多來幾次
如果停掉其中一個服務節點,那么就會導致33%的請求會失敗。這個問題需要熔斷器來解決,后面寫好了再來補充
本次demo知識點總結
1、服務的注冊發現與消費至少三個模塊,分別為注冊中心。服務提供者。服務消費者。依次按順序啟動。
2、可以對注冊中心以及服務提供者分別進行負載均衡。通過配置文件修改端口即可實現。
3、服務消費者對服務的調用消費:Ribbon+RestTemplate是一種客戶端負載均衡的消費服務的方式,還有一種消費方式:feign,也是基于ribbon實現需要自己創建一個接口注入到Beans,并且feign集成了ribbon,結合了eureka,默認實現了負載均衡。
4、關于注解@EnableEurekaClient 不加也可以,應該是新版cloud的特性,個人不太確定,沒找到官方解釋。源碼注釋也說是可選的。個人認為是通過配置文件生效的。
5、yml中配置的信息,注冊中心指定注冊中心的地址,服務提供者注冊到注冊中心指定的地址完成服務注冊,服務消費者指定注冊中心的地址用來獲取服務。
6、倆個注解:@EnableDiscoveryClient和@EnableEurekaClient的效果一樣,用哪個取決于用什么注冊中心,如果選用的注冊中心是eureka,那么就推薦@EnableEurekaClient,如果是其他的注冊中心,那么推薦使用@EnableDiscoveryClient【但是這吊玩意可選的。。】
未完待續——如果看到這里了,(●'?'●)該去點贊了啊喂
有空寫完其他的服務相關的再來補充,啥玩意路由啊,斷路器啊,消息總線啊,服務鏈路啊啥的。
智能推薦
SpringCloud教程(一)服務的注冊與發現(Eureka)
1、環境介紹: 開發工具idea、基于springboot2.0.3和springcloud Finchley。 2、創建服務注冊中心 采用Eureka作為服務注冊與發現的組件 新建springboot項目,項目名eureka pom.xml文件...
springcloud光速入門(一) 服務的注冊與發現
springcloud光速入門 簡單概述 springcloud看上去很難,很恐怖,但是我一遍學下來,感覺還是蠻容易的,面向配置編程,這一篇主要是講配置,細節可能比較少。首先我們的微服務應該有以下部分: 服務注冊中心 簡單說一下,服務注冊中心就是我們的一個類,可以有很多方法,但是我們的方法只能被我們同一個項目中的其他類調用,或者說我電腦上寫了一個類,有很多方法,但是我沒辦法讓另一臺電腦調用這個方法...
SpringCloud (一)、服務注冊與發現
微服務架構 “微服務架構” 在之前幾年就很火爆了,以至于現在關于微服務的文章很多,資料也是海量,社區同樣也是很活躍。 微服務架構 的兩大主流 應該就是SpringCloud 與 dubbo 了。 說了那么多,微服務是什么呢? 簡單的說,微服務架構就是將一個完整的應用垂直拆分成多個不同的服務,每個服務都是一個個體,可以獨立部署、獨立維護、獨立擴展、服務與服務之間 通過諸如RE...
SpringCloud(一) eureka服務注冊與發現
一、 Eureka介紹 Eureka是一個基于REST(Representational State Transfer)的服務,主要用于AWS cloud, 提供服務定位(locating services)、負載均衡(load balancing)、故障轉移(failover of middle-tier servers)。我們把它叫做Eureka Server. Eureka也提供了基于Jav...
SpringCloud(一):Eureka服務注冊與發現
Eureka是Netflix開源的一款提供服務注冊和發現的產品,是springCloud體系中最重要最核心的組件之一。 Eureka作為SpringCloud的注冊中心,主要負責服務的注冊與發現; 每個微服務都是一個Eureka client組件,負責將該服務根據id、ip和端口注冊到Eureka Server中; Eureka Server是一個注冊中心,該組件內部維護了一個注冊表,保存了各個服...
猜你喜歡
SpringCloud學習(一)入門服務的注冊、發現、調用
服務的注冊與發現 注冊中心(eureka server) 使用eureka作為注冊中心。 創建eureka-service工程 創建工程,選擇Spring Initializ如下圖 下一步->選擇cloud discovery->eureka server ,然后一直下一步就行了。 配置server eureka是一個高可用的組件,它沒有后端緩存,每一個實例注冊之后需要向注冊中心發送心...
SpringCloud——服務的注冊與發現Eureka
一、spring cloud簡介 Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線)。分布式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支持實現這些模式的服務和應用程序。他們將在任何分布式環境中運行良好,包括開發...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...