三、本地負載均衡器與openfeign聲明式客戶端


前言

本文是根據螞蟻課堂余勝軍老師的課程所做筆記,記錄的要點,部分自己的理解可能有所偏差,不當之處會進行修改。

本地負載均衡器

本地負載均衡器負責從注冊中心上獲取接口調用地址列表,本地實現負載均衡算法。

原理:獲取接口地址列表,采用算法獲取一個接口地址實現本地rpc遠程調用。

本地負載均衡器與Nginx實現負載均衡器的區別

Nginx屬於服務器負載均衡器,客戶端所有的請求都統一交給Nginx,再由Nginx轉發到真實服務實現負載均衡。

本地負載均衡器:屬於客戶端負載均衡。

應用場景:

  • Nginx實現對服務器的負載均衡,一般用於tomcat/jetty服務器
  • 本地負載均衡器屬於客戶端負載均衡器,一般用於微服務rpc遠程調用,比如dubbo、openfeign等。

LoadBalanced結合Rest

@GetMapping("/orderRibbonToMember")
public Object orderRibbonToMember() {
    //通過服務地址加上方法名調用,String.class為方法返回值類型
    String object = restTemplate.getForObject("http://member-nacos/user", String.class);
    return "調用返回結果"+object;
}

restTemplate通過服務名來訪問,restTemplate上要加上@LoadBalanced注解來實現負載均衡,底層使用的是ribbon。自動完成了通過服務名獲取調用地址列表,並選擇一個進行調用的功能。

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

使用LoadBalancerClient實現負載

LoadBalancerClient已經注冊,可直接注入使用

@GetMapping("/orderLoadBalancerClient")
public Object orderLoadBalancerClient() {
    //根據服務名通過負載均衡算法獲得服務實例
    ServiceInstance choose = loadBalancerClient.choose("member-nacos");
    return choose;
}

Openfeign客戶端

SpringCloud第一代采用的是feign,第二代采用openfeign。

Openfeign客戶端是一個Web聲明式的Http客戶端遠程調用工具,底層封裝了HttpClient技術。

feign是netflix研發,而openfeign是SpringCloud自己研發的,但在使用上的代碼寫法幾乎是一致的。

在項目本地創建一個對應於要遠程調用的服務的接口,然后使用@FeignClient注解。注意,要使用@EnableFeignClients開啟openfeign

導入openfeign的依賴

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

在service-api-member模塊下有一個供調用的服務接口

public interface MemberService {
    @GetMapping("/user")
    String getUser();
}

在service-impl-member模塊下實現上面的接口。(接口方法的注解會被實現類的方法繼承)

@RestController
public class MemberServiceImpl implements MemberService {
    @Override
    public String getUser() {
        return "會員服務調用";
    }
}

我們要在service-order模塊中調用MemberService的實現方法。

MemberService的實現模塊的服務名為member-service。在service-order中創建接口對應於MemberService,使用@FeignClient根據服務名可獲取調用地址並且已經實現了負載均衡。

@FeignClient("member-service")
public interface MemberServiceFeign {
    @GetMapping("/user")
    String getUser();
}

這樣我們在service-order里使用MemberServiceFeign接口中的方法就可以調用MemberService的實現類的方法。

@RestController
public class OrderService {

    @Autowired
    private MemberServiceFeign memberServiceFeign;

    @GetMapping("orderFeignToMember")
    public String orderFeignToMember() {

        String user = memberServiceFeign.getUser();
        return user;
    }
}

注意feign客戶端調用的事項:如果請求參數沒有加上注解的話,默認采用post請求

Nacso服務注冊 服務名稱命名不能有下划線,feign獲取服務時,服務名有下划線會報錯。


免責聲明!

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



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