SpringCloud如何使用Eureka實(shí)現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)
相信大家最關(guān)心的肯定不是什么一大堆的破理論,然后還似懂非懂的,最關(guān)心得莫過(guò)于服務(wù)之間的參數(shù)傳遞,數(shù)據(jù)獲取。
Ok,今天就告訴大家三種微服務(wù)之間傳輸數(shù)據(jù)的方式,分別是:
1、最基本的利用Ip端口進(jìn)行請(qǐng)求訪問(wèn)接口實(shí)現(xiàn)數(shù)據(jù)的傳輸
2、使用Eureka取代Ip(硬編碼)的方式實(shí)現(xiàn)數(shù)據(jù)的傳輸
3、使用Feign更加快捷"分服務(wù)"的方式實(shí)現(xiàn)微服務(wù)之間的數(shù)據(jù)傳輸(對(duì)Feign一點(diǎn)不了解的暫時(shí)不用理解,就是SpringCloud的組成的一部分后期會(huì)進(jìn)行詳細(xì)講解,在此處講解只是為自己mark一下)
前提:搭建好Eureka注冊(cè)中心,假設(shè)現(xiàn)在有一個(gè)訂單微服務(wù)(服務(wù)消費(fèi)者),一個(gè)用戶微服務(wù)(服務(wù)提供者),然后需要訂單微服務(wù)調(diào)用用戶微服務(wù),獲取用戶的信息,并且兩個(gè)服務(wù)都能正常運(yùn)行,為了方便此處使用SpringJpa的方式獲取數(shù)據(jù)。
一、使用RestTemplate+Ip方式:
1、傳遞數(shù)據(jù)大部分就是以集合和對(duì)象的形式進(jìn)行傳遞,所以在這里就用集合和對(duì)象的方式為例
在用戶微服務(wù)(服務(wù)提供者)中寫好被調(diào)用的查詢方法
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserRepository userRepository;
@GetMapping("/getallUser")
public List<User> getUserPage(){
return userRepository.findAll();
}
@GetMapping("/getUser")
public User getUser(Long userId){
return userRepository.getOne(userId);
}
}
@Repository
public interface UserRepository extends JpaRepository<User,Long> {
}
@Entity
@Table(name="TM_USER")
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
public class User implements Serializable, Cloneable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long userId;
/**
* 登錄名
*/
@Column(name = "USER_NAME")
private String userName;
/**
* 用戶名
*/
@Column
private String name;
/**
* 薪水
*/
@Column
private BigDecimal balance;
/**
* 年齡 get set方法已省略 自行添加
*/
@Column
private int age;}
Ok,服務(wù)提供者已經(jīng)寫好,下面開(kāi)始編寫服務(wù)消費(fèi)者
2、在訂單微服務(wù)(服務(wù)消費(fèi)者)的啟動(dòng)類中添加生成RestTemplate的Bean
@SpringBootApplication
@EnableEurekaClient //啟用eureka客戶端
public class MicroserviceSimplecConsumerOrderServerApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroserviceSimplecConsumerOrderServerApplication.class, args);
}
}
在訂單微服務(wù)(服務(wù)消費(fèi)者)配置文件yml中添加,其中l(wèi)ocalhost:9021改為用戶微服務(wù)(服務(wù)提供者的Ip和端口)
user: urlPath: http://localhost:9021
訂單服務(wù)控制層編寫,此處的User為用戶微服務(wù)的復(fù)制然后去掉@Column、@Table等注釋只是一個(gè)臨時(shí)存儲(chǔ)對(duì)象和數(shù)據(jù)庫(kù)沒(méi)有任何關(guān)聯(lián)
@RestController
@RequestMapping("/order")
public class OrderServerController {
@Autowired
private RestTemplate restTemplate;
@Value("${user.urlPath}")
private String urlPath;
//獲取集合方式
@GetMapping("/allUser")
private List<User> getAllUser(){
ResponseEntity<List<User>> responseEntity = restTemplate.exchange("urlPath"+/user/getallUser?",
HttpMethod.GET, null, new ParameterizedTypeReference<List<User>>() {});
return responseEntity.getBody();
}
//獲取單個(gè)對(duì)象方式
@GetMapping("/getUser")
private User getUser(Long userId){
User user = restTemplate.getForObject("urlPath"+/user/getUser?userId="+userId,User.class);
return user;
}
}
二、使用Eureka的方式獲取
很簡(jiǎn)單就是直接把訂單微服務(wù)(服務(wù)消費(fèi)者)OrderServerController中的userPath替換為注冊(cè)Eureka上面的服務(wù)名即可就是這么簡(jiǎn)單。假設(shè)用戶微服務(wù)的服務(wù)名為:microservice-privider-user
spring:
application:
name: microservice-privider-user
然后就可以直接進(jìn)行替換處理,即:
@GetMapping("/allUser") //返回集合
private List<User> getAllUser(){
ResponseEntity<List<User>> responseEntity = restTemplate.exchange("microservice-privider-user"+"/user/getallUser", HttpMethod.GET, null, new ParameterizedTypeReference<List<User>>() {});
return responseEntity.getBody();
}
//返回對(duì)象
@GetMapping("/getUser")
private User getUser(Long userId){
User user = restTemplate.getForObject("microservice-privider-user"+/user/getUser?userId="+userId,User.class);
return user;
}
Ok,使用第二種方式已經(jīng)編寫完成
使用服務(wù)名替換了固定的ip,解決了Ip硬編碼不容易維護(hù)的問(wèn)題
至于第三種Feign的方式會(huì)在以后講解“Feign:聲明性Rest客戶端”的時(shí)候進(jìn)行詳細(xì)講解
gitHub地址:https://github.com/mackjie/microservice-spring-cloud因?yàn)榕渲昧薘abbitMQ,所以請(qǐng)先閱讀ReadMe然后進(jìn)行啟動(dòng)項(xiàng)目,否則會(huì)啟動(dòng)報(bào)錯(cuò)
springcloud學(xué)習(xí)之Eureka Client搭建和服務(wù)間調(diào)用
Eureka Client搭建:
一、引入pom依賴
<!-- Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
二、啟動(dòng)類推薦添加@EnableEurekaClient注解
就是如果選用的注冊(cè)中心是eureka,那么就推薦@EnableEurekaClient,
如果是其他的注冊(cè)中心(zookeeper,consul等),那么推薦使用@EnableDiscoveryClient。
三、配置文件添加:
#eureka
spring.application.name=producer
#注冊(cè)中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#是否把自己注冊(cè)
eureka.client.register-with-eureka=true
#是否搜索服務(wù)信息
eureka.client.fetch-registry=true
#使用ip地址注冊(cè)
eureka.instance.prefer-ip-address=true
#注冊(cè)中心列表顯示的狀態(tài)
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
服務(wù)調(diào)用:
有兩種方式:
一、ribbon(負(fù)載均衡)+restTemplate
啟動(dòng)類添加:
@Bean
@LoadBalanced//負(fù)載均衡
public RestTemplate initRestTemplate() {
return new RestTemplate();//
}
@Bean//負(fù)載均衡的規(guī)則,下面的是其中之一:隨機(jī),還有權(quán)重,輪詢等
public IRule initIRule() {
return new RandomRule();
}
RandomRule表示隨機(jī)策略
RoundRobinRule表示輪詢策略(默認(rèn))
WeightedResponseTimeRule表示加權(quán)策略
BestAvailableRule表示請(qǐng)求數(shù)最少策略
然后在controller中自動(dòng)裝配RestTemplate后使用 restTemplate.getForObject()調(diào)用。
二、feign(推薦)
1、引入pom依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
2、啟動(dòng)類添加@EnableFeignClients注解
3、創(chuàng)建一個(gè)接口,
package com.sumengnan.test.web;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "eureka",fallback = HtystrixEurekaFallback.class)//調(diào)用失敗后回滾執(zhí)行方法
public interface EurekaServiceApi {
@GetMapping("test")
String test();
}
回滾的方法:
package com.sumengnan.test.web;
/**
* eureka熔斷回調(diào)類
*/
public class HtystrixEurekaFallback implements EurekaServiceApi {
@Override
public String test() {
return "連接失敗,請(qǐng)稍后再試!";
}
}
4、然后在controller中自動(dòng)裝配EurekaServiceApi后使用eurekaServiceApi.test()調(diào)用。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring security基于數(shù)據(jù)庫(kù)中賬戶密碼認(rèn)證
這篇文章主要介紹了Spring security基于數(shù)據(jù)庫(kù)中賬戶密碼認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
IDEA?設(shè)置?SpringBoot?logback?彩色日志的解決方法?附配置文件
這篇文章主要介紹了IDEA?設(shè)置?SpringBoot?logback?彩色日志(附配置文件)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
Java 實(shí)戰(zhàn)圖書管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
在Spring Boot中淺嘗內(nèi)存泄漏的實(shí)戰(zhàn)記錄
本文給大家分享在Spring Boot中淺嘗內(nèi)存泄漏的實(shí)戰(zhàn)記錄,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
Spring中的@ControllerAdvice三種用法詳解
這篇文章主要介紹了Spring中的@ControllerAdvice三種用法詳解,加了@ControllerAdvice的類為那些聲明了(@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的)方法的類而提供的<BR>專業(yè)化的@Component,以供多個(gè)Controller類所共享,需要的朋友可以參考下2024-01-01
java之生產(chǎn)故障定位Arthas問(wèn)題
這篇文章主要介紹了java之生產(chǎn)故障定位Arthas問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
解決程序啟動(dòng)報(bào)錯(cuò)org.springframework.context.ApplicationContextExcept
文章描述了一個(gè)Spring Boot項(xiàng)目在不同環(huán)境下啟動(dòng)時(shí)出現(xiàn)差異的問(wèn)題,通過(guò)分析報(bào)錯(cuò)信息,發(fā)現(xiàn)是由于導(dǎo)入`spring-boot-starter-tomcat`依賴時(shí)定義的scope導(dǎo)致的配置問(wèn)題,調(diào)整依賴導(dǎo)入配置后,解決了啟動(dòng)錯(cuò)誤2024-11-11

