springcloud之eureka服務消費基本用法--筆記


0 環境

系統環境:win10
編輯器:IDEA

1 提供者提供消費接口

首先提供者提供訪問接口 然后創建消費者 消費這個訪問接口
// 提供接口
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello provider";
    }
}

2 創建消費者&基本使用

創建消費者需要獲取provider(提供者)的接口地址 需要到eureka server中查找 先寫死訪問地址 慢慢解耦 這個東東到底好在哪里

1 依賴

添加web client依賴 一會要用到 還是創建springboot項目的方式

2 yml配置

spring:
  application:
    name: consumer


server:
  port: 1301

eureka:
  client:
    service-url:
      defaultZone: http://localhost:1234/eureka

3 消費接口

// 下面的消費接口都需要這個
// 以前需要添加啟動注解 現在不需要添加 即可使用
    @Autowired
    DiscoveryClient discoveryClient;
/**
    * @Description: 消費者和提供者直接連接 強耦合 未通過server
    * @Param:
    * @return:  正確 -> 返回提供者定死的hello里的返回值 失敗 -> error
    * @Author: 水面行走
    * @Date: 2020/2/27
    */
    @GetMapping("/useHello")
    public String useHello(){
        // HttpURLConnection發起請求 寫死provider地址
        HttpURLConnection connection = null;

        try {
            // 新建url openConnxxx打開連接 -> HttpURLConnection
            URL url = new URL("http://localhost:1300/hello");
            connection = (HttpURLConnection) url.openConnection();

            // 若是200 讀取
            if (200 == connection.getResponseCode()) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                // 就一行的字符串 不需要遍歷了
                String s = reader.readLine();

                return s;
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "use error";
    }

4 啟動項目

 

 5 消費接口改造

/** 
    * @Description: 改造1 通過server查詢需要獲取提供者的信息(在上面的基礎連接上進行升級改造)
    * @Param:  
    * @return:  
    * @Author: xxxxx
    * @Date: 2020/2/xx
    */
    @GetMapping("/useHello1")
    public String userHello1(){
     // 由於查詢到的服務列表是一個集合 可能是集合化部署 集合中每一項就是一個實例 List
<ServiceInstance> provider = discoveryClient.getInstances("provider"); for (ServiceInstance serviceInstance : provider) { // 獲取host port stringbuffer->append追加 String host = serviceInstance.getHost(); int port = serviceInstance.getPort(); // 類似格式 http://localhost:1300/hello // 上面的寫死這個格式 現在是動態獲取 拼接 最后在轉換 其他一樣的 StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("http://") .append(host) .append(":") .append(port) .append("/hello"); System.out.println("格式轉換:"+stringBuffer.toString()); HttpURLConnection connection = null; try { // 在通過tostring轉化為需要的url // 新建url openConnxxx打開連接 -> HttpURLConnection URL url = new URL(stringBuffer.toString()); connection = (HttpURLConnection) url.openConnection(); // 若是200 讀取 if (200 == connection.getResponseCode()) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 就一行的字符串 不需要遍歷了 String s = reader.readLine(); return s; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return "error"; }

6 重啟項目

 

 7 集群化部署&簡單的負載均衡

// 為了體驗負載均衡的效果 添加了一個port數值
@RestController
public class HelloController {
    @Value("${server.port}")
    Integer port;

    @GetMapping("/hello")
    public String hello(){
        return "hello provider" + port;
    }
}
首先修改提供者接口 打包提供者 打包成功后 定位到提供者target目錄 右鍵打開命令行 輸入java -jar xxx.jar --server.port=xxxx(啟動提供者) 

 

為了實現簡單負載均衡(取余) 最好全部重啟一下 開啟server provider consumer(啟動前 添加下面的代碼) 
/**
     * @Description: 改造2 集群式+負載均衡(取余)
     * @Param:
     * @return:
     * @Author: 
     * @Date: 2020/2/xx
     */
    @GetMapping("/useHello2")
    public String userHello2(){
        // 由於查詢到的服務列表是一個集合 可能是集合化部署 集合中每一項就是一個實例
        List<ServiceInstance> provider = discoveryClient.getInstances("provider");
//        for (ServiceInstance serviceInstance : provider) {
        int count = 0;
//        System.out.println((count) % provider.size());
        ServiceInstance serviceInstance = provider.get((count++) % provider.size());
        // 獲取host port stringbuffer->append追加
        String host = serviceInstance.getHost();
        int port = serviceInstance.getPort();
        // 類似格式 http://localhost:1300/hello
        // 上面的寫死這個格式 現在是動態獲取 拼接 最后在轉換 其他一樣的
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("http://")
                .append(host)
                .append(":")
                .append(port)
                .append("/hello");
        //            System.out.println("格式轉換:"+stringBuffer.toString());

        HttpURLConnection connection = null;

        try {
            // 在通過tostring轉化為需要的url
            // 新建url openConnxxx打開連接 -> HttpURLConnection
            URL url = new URL(stringBuffer.toString());
            connection = (HttpURLConnection) url.openConnection();

            // 若是200 讀取
            if (200 == connection.getResponseCode()) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                // 就一行的字符串 不需要遍歷了
                String s = reader.readLine();

                return s;
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

//        }
        return "error";
    }

 

 

 

 

 3 升級改造

2方面動手:
    http調用 --> spring提供RestTemplate
    負載均衡 --> Ribbon

1 http調用

http調用 將HttpURLConnection以及下面的那一段 用RestTemplate替換
application中添加 
----------------------------

@Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

-----------------------------------
@Autowired
    DiscoveryClient discoveryClient;
@GetMapping("/useHello3")
    public String userHello3() {
        // 由於查詢到的服務列表是一個集合 可能是集合化部署 集合中每一項就是一個實例
        List<ServiceInstance> provider = discoveryClient.getInstances("provider");
//        for (ServiceInstance serviceInstance : provider) {
        int count = 0;
//        System.out.println((count) % provider.size());
        ServiceInstance serviceInstance = provider.get((count++) % provider.size());
        // 獲取host port stringbuffer->append追加
        String host = serviceInstance.getHost();
        int port = serviceInstance.getPort();
        // 類似格式 http://localhost:1300/hello
        // 上面的寫死這個格式 現在是動態獲取 拼接 最后在轉換 其他一樣的
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("http://")
                .append(host)
                .append(":")
                .append(port)
                .append("/hello");
        //            System.out.println("格式轉換:"+stringBuffer.toString());
        String s = restTemplate.getForObject(stringBuffer.toString(), String.class);
        return s;
    }

2 開啟負載均衡

application中添加bean
----------------------------------
@Bean
    // 負載均衡注解
    @LoadBalanced
    RestTemplate restTemplateOne(){
        return new RestTemplate();
    }
-------------------------------------------------
controller層添加
======================
@Autowired
    DiscoveryClient discoveryClient;

@Autowired
    @Qualifier("restTemplateOne")
    RestTemplate restTemplateOne;

@GetMapping("/useHello4")
    public String userHello4() {
        String address = "http://provider/hello";
        String retStr = restTemplateOne.getForObject(address, String.class);
        return retStr;
    }

3 效果

 

 4 小結

給RestTemplate添加負載均衡的注解 開啟它 具備了負載均衡 可以理解為RestTemplate = http調用 + 負載均衡

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM