Nacos 配置中心和服務的註冊發現

在上一篇中,咱們已經把Nacos的集羣搭建好了,那麼既然已經搭建好了,就要在我們的項目中去使用。Nacos既能夠作配置中心,也能夠作註冊中心。咱們先來看看在項目中如何使用Nacos作配置中心。java

Nacos配置中心

在項目中使用Nacos作配置中心仍是比較簡單的,咱們先建立SpringBoot項目,而後引入nacos-config的jar包,具體以下:spring

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

若是你不想使用SpringBoot默認的nacos-config版本,也能夠指定版本號。bootstrap

首先,咱們進入到nacos的管理後臺,第一步要建立命名空間,如圖:瀏覽器

咱們建立了user的服務配置,之後user相關的微服務都在這個命名空間中拉取配置。咱們點擊保存,命名空間的id會自動生成,這個id是十分重要的,咱們要在項目中配置這個id。命名空間建立好之後,咱們再建立配置文件,app

在配置列表中,咱們先選中剛纔新建的命名空間:user服務配置。而後再點擊新建,個人截圖中已經把user-provider的配置文件建立好了。咱們能夠看一下如何新建,如圖:負載均衡

其中Data ID咱們叫作user-provider,group咱們用來區分本地環境、測試環境、生產環境。配置格式咱們選擇yaml,內容咱們先配置一個username看看能不能生效。ide

而後在resources目錄下建立bootstrap.yml,這個bootstrap.yml和application.yml是不同的,它優先加載於application.yml,你們必定要注意他們的區別。咱們要在bootstrap.yml文件中,要配置nacos的地址、命名空間、文件名等信息,具體以下:微服務

spring:
  cloud:
    nacos:
      server-addr: nacos-host:80
      config:
        file-extension: yml
        name: user-provider
        group: ${spring.profiles.active}
        namespace: e5aebd28-1c15-4991-a36e-0865bb5af930
  application:
    name: user-provider
  • spring.application.name,這個不用說了,就是你應用的名稱,咱們叫作user-provider,用戶服務的提供者。
  • 再看上面的部分server-addr,這個是nacos的地址,咱們配置爲nacos-host:80。其中nacos-host須要配置host,指向nacos的ip,而端口80也是須要指定的,若是不指定端口,會默認8848端口。
  • 再看config的部分,file-extension,文件的擴展名,這裏咱們使用yml,相應的,在nacos配置中心中,配置格式選擇yaml。
  • config.name對應着nacos管理後臺的Data ID。
  • group,在這裏是分組,咱們用做區分不一樣環境的標識,經過項目啓動時傳入的參數${spring.profiles.active}得到。
  • namespace,命名空間,這裏要填寫命名空間的id,這個id在nacos後臺中獲取。這裏咱們填寫的是user配置服務的命名空間id。

到這裏,在項目中使用nacos作配置中心就搭建好了。咱們在項目當中寫個屬性類,測試一下,看看能不能取到值。測試

@RefreshScope
@Setter@Getter
@Configuration
public class DatabaseConfig {

    @Value("${username}")
    private String username;
    @Value("${server.port}")
    private String port;
}
  • 咱們寫了個DatabaseConfig類,先注意一下類上面的註解,@RefreshScope這個註解可使咱們在nacos管理後臺修改配置之後,項目不用重啓,就能夠更改變量的值。
  • @Setter@Getter這個是Lombok的註解,能夠省去setget方法。
  • @Configuration標識這個類是一個配置類,項目啓動時會實例化。
  • 在類裏邊,咱們定義了兩個變量,username和port,兩個變量上面的註解@Value,能夠取到對應的,屬性的值。${username}這個咱們在nacos管理後臺已經設置了,${server.port}這個咱們能夠經過項目啓動參數獲取到,一會帶着你們試一下。

咱們在寫個controller,把變量的值打印出來,以下:url

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private DatabaseConfig databaseConfig;


    @RequestMapping("config")
    public String config() {
        return databaseConfig.getUsername()+":"+databaseConfig.getPort();
    }
}

咱們將username和port兩個變量打印出來。好了,程序相關的部分就都寫好了,而後,咱們添加項目啓動參數,如圖:

  • spring.profiles.active=local,這個參數很重要,項目要用這個local值去nacos管理後臺找對應的分組group是local的配置。
  • server.port=8080,這個是項目的啓動端口,同時,咱們也將這個值打印出來了。

好了,咱們如今啓動項目,而且在瀏覽器中訪問咱們剛纔寫的controller,瀏覽器返回的結果以下:

user:8080
  • user,是咱們在nacos中配置的值,8080是咱們添加的啓動參數。

返回結果沒有問題。而後咱們再去nacos管理後臺將user改爲tom,項目不重啓,再看看返回的結果,如圖:

確認發佈之後,咱們刷新一下瀏覽器,

tom:8080

咱們並無重啓項目,可是返回的結果變成了tom。怎麼樣?使用nacos作配置中心仍是比較好用的吧~

Nacos註冊中心

一般狀況下,咱們通常會選擇Zookeeper、Eureka作註冊中心,其實Nacos也是能夠作註冊中心的。既然咱們項目使用了Nacos作配置中心,那麼使用Nacos作註冊中心也是很是好的選擇。下面讓咱們看看在項目中如何使用Nacos作註冊中心。

首先,仍是在項目中引入Nacos註冊中心的jar包,以下:

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

咱們引入了nacos-discovery的jar包,若是您不想使用默認的版本,能夠指定須要引入的版本。

而後,咱們就要配置Nacos註冊中心的地址了,一般狀況下,咱們是在application.yml文件中進行配置。可是,此次咱們使用了Nacos作配置中心,就能夠在Nacos的管理後臺進行配置了,以下:

username: tom
spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacos-host:80
        namespace: e5aebd28-1c15-4991-a36e-0865bb5af930
        group: ${spring.profiles.active}
  • 咱們須要在nacos.discovery節點下進行配置,server-addr,這個屬性和前面的配置是同樣的,nacos-host是配置了HOST,指向Nacos的ip,80端口也是須要指定的,默認端口是8848。
  • namespace,命名空間,咱們複用前面的就能夠了。
  • group,一樣,咱們用來區分不一樣的環境,它的值也是從啓動參數中獲取。

最後,咱們在項目的啓動類中添加@EnableDiscoveryClient的註解,以下:

@SpringBootApplication
@EnableDiscoveryClient
public class UserProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserProviderApplication.class, args);
    }
}

好了,到這裏,服務提供者的配置以及代碼上的改動都調整完畢了,咱們啓動一下項目,而後去Nacos管理後臺看看服務是否已經註冊到Nacos當中。

咱們在Nacos管理後臺選擇服務列表菜單,能夠看到咱們啓動的項目已經註冊到nacos中了。若是咱們再啓動一個服務提供者會是什麼樣子呢?咱們剛啓動的項目指定的端口是8080,咱們再啓動一個項目,將端口指定爲8081,看看服務列表是什麼樣子。

咱們看到實例數由原來的1變爲了2。說明咱們的user-provider服務有了兩個,咱們再點右邊的詳情看一下,

服務的詳情以及具體的實例都給咱們列了出來,咱們還能夠編輯和下線具體的實例,這個咱們後面再介紹。

好了,到這裏,服務提供者的就搭建好了,咱們分別訪問兩個服務提供者的具體鏈接獲得的結果以下:

# http://localhost:8080/user/config
tom:8080

# http://localhost:8081/user/config
tom:8081

接下來,咱們再看看服務的消費者如何搭建。咱們新建一個SpringBoot項目user-consumer,這個項目咱們一樣使用Nacos做爲配置中心,並且要從Nacos這個註冊中心獲取服務列表,因此引入jar包以下:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

而後在bootstrap.yml中,填寫nacos配置中心的相關配置,這個和前面的配置的差很少的,只須要改一下相應的文件名稱就能夠了。

spring:
  cloud:
    nacos:
      server-addr: nacos-host:80
      config:
        file-extension: yml
        name: user-consumer
        group: ${spring.profiles.active}
        namespace: e5aebd28-1c15-4991-a36e-0865bb5af930
  application:
    name: user-consumer
  • 注意config.name,咱們改成了user-consumer。而且應用的名稱改成了user-consumer。

而後,咱們再去Nacos管理後臺添加user-consumer的配置,如圖:

  • DataID就是咱們配置的user-consumer,group咱們一樣配置爲local,標識着本地。
  • 具體的配置內容是nacos服務的地址,如圖。這樣咱們的服務消費者項目user-consumer就能夠從nacos配置中心獲取到註冊中心的地址和命名空間,而且能夠從命名空間獲取服務的地址。

配置的部分就到這裏了,而後再去啓動類中,添加@EnableDiscoveryClient註解,以下:

@SpringBootApplication
@EnableDiscoveryClient
public class UserConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerApplication.class, args);
    }
}

最後,咱們寫個Controller,從Nacos獲取服務提供者的地址,並調用服務提供者,以下:

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("consumer")
    public String consumer() {
        ServiceInstance provider = loadBalancerClient.choose("user-provider");
        String url = "http://"+provider.getHost()+":"+provider.getPort()+"/user/config";

        RestTemplate restTemp = new RestTemplate();
        String result = restTemp.getForObject(url, String.class);

        return result;
    }
}
  • 這個是SpringCloud Alibaba官網給出的調用示例,使用的是LoadBalancerClient,咱們先將其注入。
  • 在方法裏邊,咱們調用choose方法,選擇user-provider服務,這個是咱們服務提供者的名稱,在nacos管理後臺的服務列表中能夠查看到的,這個方法會返回具體的服務實例,咱們的服務實例有2個,分別是8080端口和8081端口的兩個服務,在這裏,默認是輪詢的負載均衡策略。
  • 選擇了具體的服務實例,咱們就來拼裝請求地址,從服務實例中獲取地址和端口。
  • 最後使用RestTemplate完成調用。

最後,咱們配置項目啓動,設置spring.profiles.active=local,而且指定端口爲9090,如圖:

最後,咱們啓動項目,訪問http://localhost:9090/user/consumer,訪問結果以下:

tom:8080

很明顯,咱們調用到了8080端口的服務提供者,咱們再刷新一下,看看返回結果,

tom:8081

此次又調用到了8081端口的服務提供者,咱們屢次刷新,發現它會在8080和8081之間切換,這說明咱們的負載均衡策略應該是輪詢。

使用Feign完成服務的調用

上面的例子中,咱們使用的是LoadBalancerClient完成服務的調用,接下來,咱們分別看看Feign和Ribbon怎麼調用服務。咱們先來看看Feign,要使用Feign完成服務的調用,先要引入Feign的jar包,以下:

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

而後再啓動類上添加@EnableFeignClients的註解,以下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class UserConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerApplication.class, args);
    }
}

接下來,咱們寫一個interface來完成feign的服務調用和熔斷,以下:

@FeignClient(name = "user-provider",fallback = UserServiceFallback.class)
public interface UserService {
    @RequestMapping("/user/config")
    String config();
}
  • 咱們寫了一個UserService的接口,在接口上添加@FeignClient的註解,註解裏有兩個屬性,name指定服務的名稱,這裏咱們指定爲user-provider,這是咱們前面服務提供者的名稱,fallback指定發生熔斷時,調用的類。當咱們的服務提供者不能正常提供服務時,就會觸發熔斷機制,會調用熔斷服務類的邏輯,返回結果。
  • 在接口中,咱們寫了一個config()方法,方法上添加@RequestMapping的註解,並配置具體的路徑。這樣,咱們在調用服務的時候,經過Feign調用到具體的服務提供者了。

咱們再來看看熔斷實現類UserServiceFallback的具體內容,以下:

@Service
public class UserServiceFallback implements UserService {
    @Override
    public String config() {
        return "user-fallback";
    }
}
  • 首先,它是UserService接口,也就是Feign接口的實現類,而後實現接口中的方法,咱們直接返回user-fallback字符串。

Feign的接口和熔斷的實現類都寫好了,可是這還不算完,要使熔斷生效,還要添加額外的配置,咱們直接去nacos管理後臺去配置,進入到user-consumer的配置中,添加以下配置:

feign:
  hystrix:
    enabled: true
  • 這個就是feign的熔斷開關,默認是關閉的,如今打開。

最後,咱們在controller中,調用UserService接口,以下:

@Autowired
private UserService userService;

@RequestMapping("consumer-feign")
public String userService() {
    String result = userService.config();

    return result;
}
  • 將UserService,注入進來,而後直接調用方法便可。

咱們訪問一下http://localhost:9090/user/consumer-feign,看看返回的結果。以下:

tom:8080
tom:8081

返回的結果和前面是同樣的,咱們不斷的刷新,它也會在8080和8081之間輪詢。

使用Ribbon完成服務的調用

一樣,咱們也可使用Ribbon完成服務的調用,Ribbon和RestTemplate在內部是緊密結合的。咱們只須要將RestTemplate實例化,並添加@LoadBalanced註解就能夠了,以下:

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

而後在,controller中,咱們使用這個實例化好的RestTemplate,就能夠了,具體實現以下:

@Autowired
private RestTemplate restTemplate;

@RequestMapping("consumer-ribbon")
public String consumerribbon() {
    String url = "http://user-provider/user/config";
    String result = restTemplate.getForObject(url, String.class);

    return result;
}
  • 咱們將restTemplate注入進來。
  • 在具體方法中,url的地址,咱們直接寫服務名稱user-provider加路徑的方式,你們能夠參照第一種調用方式,看看區別。

咱們重啓項目,訪問http://localhost:9090/user/consumer-ribbon,結果以下:

tom:8080
tom:8081

返回的結果和前面是同樣的,咱們不斷的刷新,它也會在8080和8081之間輪詢。

使用Nacos權重負載均衡

三種服務的調用方法都給你們介紹完了,可是,他們的負載均衡策略都是輪詢,這有點不符合咱們的要求,咱們進入到Nacos的管理後臺,調節一下服務的權重,如圖:

**咱們將8080接口的服務權重由1改成10,點擊確認,再屢次刷新一下咱們的訪問地址,發現服務的調用仍是在8080和8081之間輪詢。**這是什麼狀況?這裏就不和你們賣關子了,這是由於LoadBalancerClient、Feign和Ribbon3種方式,它們的底層都是使用Ribbon作負載均衡的,而Ribbon負載均衡默認使用的策略是ZoneAvoidanceRule,咱們要修改Ribbon的默認策略,讓它使用nacos的權重,那麼該如何配置呢?

咱們進入到nacos管理後臺,修改user-consumer的配置,添加以下配置:

user-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
  • user-provider是咱們服務的名稱,你配置哪一個服務的負載均衡策略,就寫哪一個服務的名字。
  • 後面ribbon.NFLoadBalancerRuleClassName須要配置負載均衡策略的具體實現,這個實現類要實現IRule接口,在這裏,咱們指定實現類爲com.alibaba.cloud.nacos.ribbon.NacosRule。這是nacos的負載均衡規則,它是實現了IRule接口的。

咱們重啓項目,調用咱們以前的3個連接,調用哪一個效果都是同樣的,**咱們發現返回tom:8080的次數明顯增多,說明Nacos服務的權重配置生效了。**小夥伴們還能夠將權重改爲其餘的值試一下。這裏就不給你們演示了。

總結

Nacos的配置中心和服務註冊中心就給你們介紹完了,仍是很好用的,這爲咱們搭建微服務提供了另一種選擇。固然消費端的調用仍是首推Feign+hystrix熔斷的,功能很強大,小夥伴們在項目中多實踐吧~

相關文章
相關標籤/搜索