nacos、ribbon和feign的簡明教程


nacos簡明教程

為什么需要nacos?

在微服務架構中,微服務之間經常要相互通信和調用,而且一個服務往往存在多個實例來降低負荷或保證高可用。我們假定A服務要調用B服務,最簡單的方式把B服務的地址和端口保存在A服務的配置文件中。然后通過http請求去完成B服務的調用。但是B服務可能有好多個實例,而且可能會隨着業務的需求隨時的擴展或者停用掉一些實例,這個時候B服務的地址和端口可能會經常發生改變。如果記錄在配置文件就多有不便。而且在眾多的B服務中,可能有一些服務會出現各種問題壞掉,我們可能還需要寫一個心跳檢測,看看是不是所有的服務都正常運行,及時地剔除掉那些不能用的服務。如果完備穩定的實現這些功能,是一個不小的工作量。還好凡是有困難的地方總有前人造輪子。而Nacos就是來解決這樣問題的輪子。

如圖所示,通過簡單的配置和注解,所有的微服務都把自己信息登記到Nacos server中去。在需要調用的時候,通過登記到Nacos server的名字就可以完成微服務間的調用。比如有以前通過訪問 http://12.3.3.5:8090/service 來訪問微服務的,變成了http://provider/service 的方式來訪問,把服務與端口地址解耦。

如何使用Nacos

Nacos server的啟動

Nacos使用非常的簡單。從Nacos官網下載release包,linux\mac下面執行sh startup.sh -m standalone,windows下面執行startup.cmd -m standalone 然后就可以完成Nacosserver的啟動。

在微服務中使用Nacos做服務注冊和發現

通過maven架包使用Nacos發現服務

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.3.RELEASE</version>
</dependency>

在配置文件中簡單配置

spring:
    application:
        name: provider  #這個很重要,是注冊到Nacos中調用的服務的名稱
    cloud:
        nacos:
        discovery:
            server-addr: 127.0.0.1:8848 #配置Nacos的服務地址

在啟動類上增加注解@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient 
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

}

通過簡單的幾步就可以完成了把微服務注冊到了Nacos Server。怎么樣很簡單吧。當然Nacos除了做服務注冊和發現外,還可以做配置中心,使用方法大同小異。更多豐富的操作參考官方文檔 Nacos官方網站

服務的調用

如果要通過http://provider/service的方式去調用微服務,還需要構造http請求,請求回來的結果還要做json解析等等一系列繁雜的工作。而Ribbon就用來解決這個問題的。在springcloud.alibaba的nacos發現服務的Maven包中,已經包含了ribbon.我們通過簡單的幾行代碼,就可以完成微服務的調用。

假定在provider服務中有這么一段代碼,我們要調用

//例子來自Nacos官網
    @RequestMapping(value = "/echo/{string}",method = RequestMethod.GET)
    public String echo(@PathVariable String string)
    {
        return "Hello Nacos Discover" + string;
    }

我們只需要實例化一個RestTemplate

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

然后就可以再想要調用的地方來通過下面的代碼來非常簡單地調用。

String result = restTemplate.getForObject("http://provider/echo/"+str,String.class);

負載均衡的問題

前面講到,在微服務環境中常常同一個服務會有N多實例,我們不希望所有的調用都跑到一個實例上去,這個時候就需要用到負載均衡。我們只需要在啟動來加上 @LoadBalanced 注解。在配置文件的spring.application.name相同的應用會被認為是同一個微服務,然后轉發可以通過ribbon內置的策略路由到不同的provider中去。

如果我們期望有的provider的優先級比別的優先級高一些,可以再provider的配置文件中調節不同的權重。

spring:
  cloud:
    nacos:
      discovery:
        weight: 1 #配置權重

使用Feign

通過上面的方法,已經把微服務之間的相互調用變得非常的簡單了。但是還不夠,Feign可以讓調用更加簡單。

引用maven包

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

然后我們針對要調用的provider定義一個接口,接口的方法為要調用的方法名,參數和調用參數同名。@FeignClient 注解中name為微服務的名稱。復雜一些的方法調用可能需要在接口中配合@RequestMapping指定具體的路由規則,然后就可以通過該接口直接調用微服務方法,是不是更加清晰簡單呢?

@FeignClient(name = "provider")
@Service
public interface TestService {
    String echo(String serviceName);
}
public class TestController {
    private final RestTemplate restTemplate;
    @Autowired
    private TestService testService;

    @GetMapping("/echo2/{str}")
    public String echo2(@PathVariable String str)
    {
        return testService.echo(str);
    }
}


免責聲明!

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



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