什麼是Eureka
- Eureka服務發現
-
- 拓撲圖
- 入門Demo
-
- microservice-eureka-server
- 配置
- 啟動類
- 效果
- microservice-provider-user
- 依賴
- 配置
- 實體類
- 服務層
- 控制層
- 啟動類
- 效果
- microservice-consumer-user
- 配置
- 實體類
- 控制層
- 啟動類
- 效果
Eureka服務發現
Eureka是Netflix開發的服務發現架構,本身是一個基于REST的服務,主要用于定位運作在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud将它內建在其子項目spring-cloud-netflix中,以實作SpringCloud的服務發現功能。
Eureka包含兩個元件:Eureka Server和Eureka Client。
Eureka Server提供服務注冊服務,各個節點啟動後,會在Eureka Server中進行注冊,這樣EurekaServer中的服務系統資料庫中将會存儲所有可用服務節點的資訊,服務節點的資訊可以在界面中直覺的看到。
Eureka Client是一個java用戶端,用于簡化與Eureka Server的互動,用戶端同時也就是一個内置的、使用輪詢(round-robin)負載算法的負載均衡器。
在應用啟動後,将會向Eureka Server發送心跳,預設周期為30秒,如果Eureka Server在多個心跳周期内沒有接收到某個節點的心跳,Eureka Server将會從服務系統資料庫中把這個服務節點移除(預設90秒)。
Eureka Server之間通過複制的方式完成資料的同步,Eureka還提供了用戶端緩存機制,即使所有的Eureka Server都挂掉,用戶端依然可以利用緩存中的資訊消費其他服務的API。綜上,Eureka通過心跳檢查、用戶端緩存等機制,確定了系統的高可用性、靈活性和可伸縮性。
拓撲圖
入門Demo
microservice-eureka-server
配置
server:
port: 8761
eureka:
client:
#要不要去注冊中心擷取其他服務的位址
fetch-registry: false
#自己就是注冊中心,不用注冊自己
register-with-eureka: false
啟動類
package com.xxx.proj.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
效果
microservice-provider-user
依賴
springboot的版本号
<version>2.2.4.RELEASE</version>
springcloud的版本号
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
配置
server:
port: 8000
spring:
application:
name: microservice-provider-user
jpa:
show-sql: true
datasource:
url: jdbc:mysql:///test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
driver-class-name: com.mysql.jdbc.Driver
username: root
password:
eureka:
instance:
prefer-ip-address: true
實體類
package com.xxx.proj.eurekaprovider.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
@Entity
@Table(name = "tb_user")
@Getter
@Setter
@ToString
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
}
服務層
package com.xxx.proj.eurekaprovider.dao;
import com.xxx.proj.eurekaprovider.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserDao extends JpaRepository<User, Integer> {
}
控制層
package com.xxx.proj.eurekaprovider.controller;
import com.xxx.proj.eurekaprovider.dao.UserDao;
import com.xxx.proj.eurekaprovider.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserDao dao;
@RequestMapping("/findById/{id}")
public User findById(@PathVariable("id") Integer id) {
Optional<User> optional = dao.findById(id);
if (optional.isPresent()) return optional.get();
else return null;
}
}
啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaProviderUser1Application {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderUser1Application.class, args);
}
}
效果
microservice-consumer-user
配置
server:
port: 8010
spring:
application:
name: micro-consumer-user
eureka:
instance:
prefer-ip-address: true
實體類
package com.xxx.proj.eurekaconsumer.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Getter
@Setter
public class User {
private Integer id;
private String username;
private String password;
}
控制層
package com.xxx.proj.eurekaconsumer.controller;
import com.xxx.proj.eurekaconsumer.entity.User;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/{id}")
public User getOne(@PathVariable("id") Integer id) {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject("http://localhost:8000/user/findById/" + id, User.class);
}
}
啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaConsumerUserApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerUserApplication.class, args);
}
}