溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在SpringCloud中使用Eureka實現(xiàn)服務之間的傳遞數(shù)據(jù)

發(fā)布時間:2021-06-09 16:24:49 來源:億速云 閱讀:293 作者:Leah 欄目:開發(fā)技術

這期內(nèi)容當中小編將會給大家?guī)碛嘘P怎么在SpringCloud中使用Eureka實現(xiàn)服務之間的傳遞數(shù)據(jù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、使用RestTemplate+Ip方式:

1、傳遞數(shù)據(jù)大部分就是以集合和對象的形式進行傳遞,所以在這里就用集合和對象的方式為例

在用戶微服務(服務提供者)中寫好被調(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,服務提供者已經(jīng)寫好,下面開始編寫服務消費者

2、在訂單微服務(服務消費者)的啟動類中添加生成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);
 }
}

在訂單微服務(服務消費者)配置文件yml中添加,其中l(wèi)ocalhost:9021改為用戶微服務(服務提供者的Ip和端口)

user:
  urlPath: http://localhost:9021

訂單服務控制層編寫,此處的User為用戶微服務的復制然后去掉@Column、@Table等注釋只是一個臨時存儲對象和數(shù)據(jù)庫沒有任何關聯(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();
    }
    //獲取單個對象方式
    @GetMapping("/getUser")
    private User getUser(Long userId){
        User user = restTemplate.getForObject("urlPath"+/user/getUser?userId="+userId,User.class);
        return user;
    }
}

二、使用Eureka的方式獲取

很簡單就是直接把訂單微服務(服務消費者)OrderServerController中的userPath替換為注冊Eureka上面的服務名即可就是這么簡單。假設用戶微服務的服務名為:microservice-privider-user

spring:
  application:
    name: microservice-privider-user

然后就可以直接進行替換處理,即:

@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();
    }
//返回對象
    @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)編寫完成

使用服務名替換了固定的ip,解決了Ip硬編碼不容易維護的問題

至于第三種Feign的方式會在以后講解“Feign:聲明性Rest客戶端”的時候進行詳細講解

gitHub地址:https://github.com/mackjie/microservice-spring-cloud因為配置了RabbitMQ,所以請先閱讀ReadMe然后進行啟動項目,否則會啟動報錯

springcloud學習之Eureka Client搭建和服務間調(diào)用

Eureka Client搭建:

一、引入pom依賴

<!-- Eureka Client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

二、啟動類推薦添加@EnableEurekaClient注解

就是如果選用的注冊中心是eureka,那么就推薦@EnableEurekaClient,

如果是其他的注冊中心(zookeeper,consul等),那么推薦使用@EnableDiscoveryClient。

三、配置文件添加:

#eureka
spring.application.name=producer
#注冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#是否把自己注冊
eureka.client.register-with-eureka=true
#是否搜索服務信息
eureka.client.fetch-registry=true
 
#使用ip地址注冊
eureka.instance.prefer-ip-address=true
#注冊中心列表顯示的狀態(tài)
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

服務調(diào)用:

有兩種方式:

一、ribbon(負載均衡)+restTemplate

啟動類添加:

@Bean
@LoadBalanced//負載均衡
public RestTemplate initRestTemplate() {
 return new RestTemplate();//
 }
 
 @Bean//負載均衡的規(guī)則,下面的是其中之一:隨機,還有權重,輪詢等
 public IRule initIRule() {
  return new RandomRule();
 }

RandomRule表示隨機策略

RoundRobinRule表示輪詢策略(默認)

WeightedResponseTimeRule表示加權策略

BestAvailableRule表示請求數(shù)最少策略

然后在controller中自動裝配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、啟動類添加@EnableFeignClients注解

3、創(chuàng)建一個接口,

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 "連接失敗,請稍后再試!";
    }
}

4、然后在controller中自動裝配EurekaServiceApi后使用eurekaServiceApi.test()調(diào)用。

上述就是小編為大家分享的怎么在SpringCloud中使用Eureka實現(xiàn)服務之間的傳遞數(shù)據(jù)了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI