Spring Cloud的Eureka裏的服務註冊與發現機制

繼續上篇的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都要是啓動狀態

  

相關文章
相關標籤/搜索