java B2B2C Springcloud電子商務平臺原始碼-Ribbon 基本使用

小兵2147775633發表於2019-02-15

具體內容

現在所有的服務已經通過了 Eureka 進行了註冊,那麼使用 Eureka 註冊的目的是希望所有的服務都統一歸屬到 Eureka 之中進 行處理,但是現在的問題,所有的微服務彙集到了 Eureka 之中,而客戶端的呼叫也應該通過 Eureka 完成。而這種呼叫就可以利用 Ribbon 技術來實現。需要JAVA Spring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼 一零三八七七四六二六

Ribbon 是一個服務呼叫的元件,並且是一個客戶端實現負載均衡處理的元件。伺服器端實現負載均衡可以使用 Nginx、 HAProxy、LVS 等。

Ribbon 基本使用

1、 【microcloud-consumer-80】修改 pom.xml 配置檔案,追加 Ribbon 相關依賴支援包:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
複製程式碼

2、 【microcloud-consumer-80】修改 RestConfig 配置類,在獲取 RestTemplate 物件的時候加入 Ribbon 的配置註解@LoadBalanced。

package cn.study.microcloud.config;

import java.nio.charset.Charset;
import java.util.Base64;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestConfig {
    @Bean
    public HttpHeaders getHeaders() { // 要進行一個Http頭資訊配置
        HttpHeaders headers = new HttpHeaders(); // 定義一個HTTP的頭資訊
        String auth = "studyjava:hello"; // 認證的原始資訊
        byte[] encodedAuth = Base64.getEncoder()
                .encode(auth.getBytes(Charset.forName("US-ASCII"))); // 進行一個加密的處理
        // 在進行授權的頭資訊內容配置的時候加密的資訊一定要與“Basic”之間有一個空格
        String authHeader = "Basic " + new String(encodedAuth);
        headers.set("Authorization", authHeader);
        return headers;
    }

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
複製程式碼

3、 【microcloud-consumer-80】修改 aplication.yml 配置檔案,追加 Eureka 的服務註冊地址配置。

server:
  port: 80

eureka: 
  client: 
    register-with-eureka: false #客戶端不註冊到eureka,只是進行服務的呼叫
    service-url: 
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
複製程式碼

4、 【microcloud-consumer-80】修改專案的啟動類,追加 Eureka 客戶端的配置註解:

package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class Consumer_80_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,
                args);
    }
}
複製程式碼

5、 【microcloud-consumer-80】修改控制器呼叫類;

現在在 eureka 之中註冊的所有服務的名稱都是大寫字母:MICROCLOUD-PROVIDER-DEPT;

package cn.study.microcloud.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import cn.study.vo.Dept;

@RestController
public class ConsumerDeptController {
    public static final String DEPT_GET_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/get/";
    public static final String DEPT_LIST_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/list/";
    public static final String DEPT_ADD_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/add?dname=";
    @Resource
    private RestTemplate restTemplate;
    @Resource
    private HttpHeaders headers;
    @RequestMapping(value = "/consumer/dept/get")
    public Object getDept(long id) {
        Dept dept = this.restTemplate
                .exchange(DEPT_GET_URL + id, HttpMethod.GET,
                        new HttpEntity<Object>(this.headers), Dept.class)
                .getBody();
        return dept;
    }
    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/consumer/dept/list")
    public Object listDept() {
        List<Dept> allDepts = this.restTemplate
                .exchange(DEPT_LIST_URL, HttpMethod.GET,
                        new HttpEntity<Object>(this.headers), List.class)
                .getBody();
        return allDepts;
    }
    @RequestMapping(value = "/consumer/dept/add")
    public Object addDept(Dept dept) throws Exception {
        Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL, HttpMethod.POST,
                new HttpEntity<Object>(dept, this.headers), Boolean.class)
                .getBody();
        return flag;
    }
}
複製程式碼

訪問地址:client.com/consumer/de… Ribbon 與 Eureka 整合之後使用者不再去關注具體的 Rest 服務的地 址與埠號了,所有的資訊獲取都通過 Eureka 完成。java B2B2C Springcloud電子商務平臺原始碼

相關文章