繼續上篇的eureka註冊中心集羣搭建完 , 咱們接下來搭建服務註冊與發現機制 java
服務註冊 , 咱們能夠理解爲服務提供者 providerweb
發現機制,咱們能夠理解爲消息消費者 consumerspring
繼註冊中心搭建好了後 , 繼續在哪一個maven裏添加module apache
再建立一個Spring Boot工程 providerapp
勾選以下依賴負載均衡
定義application.properties配置文件maven
#定義名字 spring.application.name=provider #要註冊到的註冊中心的路徑 eureka.client.service-url.defaultZone=http://localhost:1111/eureka #設置一下端口 server.port=8082
同樣在啓動類裏添加一個註解 , 主要和註冊中的註解不同的 @EnableDiscoveryClientide
@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
而後咱們寫個接口 , 等下讓消費者來發現 , 也就是來調用這個接口spring-boot
@RestController public class HelloController { //這裏獲取啓動項目的端口號 ,後面用來測試這裏的集羣是否搭建成功 @Value("${server.port}") String port; @GetMapping("/hello") public String hello(){ return "hello>>"+port; } }
而後啓動項目 , 從註冊中心上咱們就會發現這個 測試
這個provider的集羣 和註冊中心的相似 , 也是打包 ,而後進入目錄去啓動兩個 , 只不過這裏用來區分的是後面的端口不同 , 以下
而後咱們在去寫個發現消息的消費者 consumer
一樣在maven項目區新建一個module
也是Spring Boot項目, 勾選的依賴和上面那個同樣
具體依賴以下
<?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 http://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.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.liy</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</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>
而後一樣的去寫配置文件 application.properties
spring.application.name=consumer eureka.client.service-url.defaultZone=http://localhost:1111/eureka server.port=8083
也是在啓動類裏添加個註解
@SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean RestTemplate rs(){ return new RestTemplate(); } @Bean //添加這個註解 ,便是開啓負載均衡 @LoadBalanced RestTemplate rs2(){ return new RestTemplate(); } }
而後寫個控制類去發現去調用provider服務項目裏的接口
package com.liy; import com.netflix.discovery.converters.Auto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.List; @RestController public class HelloController { @Autowired DiscoveryClient ds; @Autowired @Qualifier("rs") RestTemplate rs; @Autowired @Qualifier("rs2") RestTemplate rs1; int count = 0; @GetMapping("/hello") public String hello() throws Exception { List<ServiceInstance> instances = ds.getInstances("provider"); ServiceInstance instance = instances.get(count++ % instances.size()); String s = "http://" + instance.getHost() + ":" + instance.getPort() + "/hello"; //String s1 = rs.getForObject(s, String.class); //return s1; URL url = new URL(s); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); if (conn.getResponseCode()==200){ InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String s1 = reader.readLine(); return s1; } return ""; } @GetMapping("/hello2") public String hello2(){ String object = rs1.getForObject("http://provider/hello", String.class); return object; } }
三個方式去調用provider的接口 ,而且獲取到數據
第一種
第二種就是上面的hello()方法 ,這個方法調用的是最原始的路徑跳轉仍是什麼的
第三種就是下面那個hello2() 方法
@GetMapping("/hello2") public String hello2(){ String object = rs1.getForObject("http://provider/hello", String.class); return object; }
而後啓動這個項目 , 調用其中一個方法 , 若是顯示了provider服務項目裏的接口返回的數據便是成功了 ,前面的註冊中心和provider都要是啓動狀態