Eureka2.0已經閉源了,但也是註冊中心的熱門組件,咱們瞭解他的使用以及原理。web
首先是parent的pom配置,這裏使用的是Hoxton.SR9版本。spring
<properties> <spring.cloud-version>Hoxton.SR9</spring.cloud-version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <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>
而後是服務端的pom配置segmentfault
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
服務端代碼,除了@SpringBootApplication註解,還須要@EnableEurekaServer註解。app
@SpringBootApplication @EnableEurekaServer public class EurekaServer8888Application { public static void main(String[] args){ SpringApplication.run(EurekaServer8888Application.class, args); } }
yml文件配置:ide
server: port: 8888 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/ # 單個註冊中心服務的時候不註冊本身 register-with-eureka: false # 單個註冊中心服務的時候不拉取數據 fetch-registry: false spring: application: name: eureka-server
上面配置完後,運行EurekaServer8888Application的main方法,訪問http://127.0.0.1:8888,出現如下界面,Eureka服務端配置完成。spring-boot
pom的配置:fetch
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
yml配置:url
server: port: 7000 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/ spring: application: name: eureka-provider
提供方Application代碼:spa
@SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
Controller代碼:3d
@RestController public class ProviderController { @RequestMapping("/getInfo") public String getInfo(String name) { return "provider-" + name; } }
啓動ProviderApplication後,查看服務端的地址,能夠看到已經註冊到註冊中心了。
此時的狀態是這樣的:
yml配置
server: port: 7500 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/ spring: application: name: eureka-consumer
消費方Application代碼,注意這邊有一個@LoadBalanced註解的RestTemplate。
@SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
Controller代碼,咱們這邊訪問的地址是eureka-provider,並無訪問到具體的ip和端口。
@RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @RequestMapping("/getInfo") public String getInfo(String name) { ResponseEntity<String> forEntity = restTemplate.getForEntity("http://eureka-provider/getInfo?name=" + name, String.class); return forEntity.getBody(); } }
啓動ConsumerApplication後,查看服務端的地址,能夠看到已經註冊到註冊中心了。
此時的狀態是這樣的:
經過地址調用消費方,能夠看到調用成功:
由於Consumer在調用Provider以前,會經過服務發現拿到註冊中心的註冊表信息,而後經過經過註冊表信息去找到Provider的IP和端口,再進行調用。
在生成過程當中,爲了高可用,咱們會搭建多個Euraka Server,這裏演示兩個,再加一個9999端口的Server。
首先是8888的yml修改,註釋掉register-with-eureka和fetch-registry,這樣使用默認值true,另外defaultZone的地址爲另一個Server的地址。
server: port: 8888 eureka: client: service-url: defaultZone: http://localhost:9999/eureka/ # 單個註冊中心服務的時候不註冊本身 #register-with-eureka: false # 單個註冊中心服務的時候不拉取數據 #fetch-registry: false spring: application: name: eureka-server
9999的配置以下,跟上面差很少:
server: port: 9999 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/ spring: application: name: eureka-server
Consumer和Provider的yml的defaultZone都修改成:
eureka: client: service-url: defaultZone: http://localhost:8888/eureka/,http://localhost:9999/eureka/
四個Application啓動後,無論訪問的是8888端口仍是9999端口,均可以看到如下信息:
此時的狀態是這樣的:Eureka的簡單示例就到這邊,後面咱們看看他的源碼是怎麼實現這些功能的。