Nacos搭建流程

要使用nacos,咱們首先得下載它的服務端,下載地址https://github.com/alibaba/nacos/releasesgit

根據你的Spring Cloud Alibaba版原本下載須要使用的版本github

我這裏是tar.gz的,下載完成後,解壓,進入bin目錄web

執行sh startup.sh -m standalonespring

經過docker安裝nacos服務端docker

docker pull nacos/nacos-server:1.1.3瀏覽器

docker run -d --name nacos -p 8848:8848 --env MODE=standalone nacos/nacos-server:1.1.3app

而後經過瀏覽器訪問http://127.0.0.1:8848/nacos/負載均衡

此時界面如圖所示測試

輸入帳號nacos,密碼nacos後,進入管理界面ui

搭建一個Spring Cloud Alibaba項目,在父項目中,Springboot版本2.1.7,SpringCloud版本Greenwich.SR2,SpringCloudAlibaba版本2.1.1.RELEASE

<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-dependencies</artifactId>
         <version>${spring-cloud.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
      <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>${spring-cloud-alibaba.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>

在具體的子項目中放入以下依賴

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

添加配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: user

啓動項目,端口8080,在管理界面中能夠看到

咱們的項目已經被註冊進來了。如今咱們來建一個相似的項目,端口號8081,編寫一個測試Controller,來查找以前的user項目。

@RestController
public class TestController {
    /**
     * 不管使用哪一種註冊中心(Eureka,Zookeeper,Consul),該DiscoveryClient是通用的
     * 它是一個接口
     */
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/test")
    public List<ServiceInstance> findUser() {
        return discoveryClient.getInstances("user");
    }
}

運行後,訪問以下

若是user啓動多個實例,這裏也能夠獲取多個user的信息

如今咱們在user模塊中增長一個Controller,用另一個模塊使用RestTemplate來調用這個Controller.

@RestController
public class TestController {

    @GetMapping("/find")
    public String findStr() {
        return "春秋一統";
    }
}

在調用模塊中使用RestTemplate來調用,咱們以前發如今discoveryClient.getInstances("user")返回List中有一個uri的屬性是咱們須要的,咱們再拼接上/find就是咱們須要的Rest API。

@Slf4j
@Service
public class ConnectServer {
    @Autowired
    private DiscoveryClient discoveryClient;
    private RestTemplate restTemplate = new RestTemplate();

    @PostConstruct
    public void trace() {
        List<ServiceInstance> instances = discoveryClient.getInstances("user");
        String targetUrl = instances.stream().map(instance -> instance.getUri().toString() + "/find")
                .findFirst()
                .orElseThrow(() -> new RuntimeException("當前沒有實例"));
        String result = restTemplate.getForObject(targetUrl, String.class);
        log.info(result);
    }
}

運行結果(部分日誌)

2019-12-06 23:09:12.764  INFO 847 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 563 ms
2019-12-06 23:09:18.229  INFO 847 --- [           main] c.cgc.cloud.nacos.service.ConnectServer  : 春秋一統
2019-12-06 23:09:18.235  WARN 847 --- [           main] c.n.c.sources.URLConfigurationSource     : No URLs will be polled as dynamic configuration sources.

如今咱們要整合Ribbon來負載均衡

先在調用模塊加入咱們須要的Apache HTTPClient依賴

<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-httpclient</artifactId>
</dependency>

給RestTemplate增長鏈接池,鏈接次數和超時時間。再打上Ribbon特有的標籤@LoadBalanced

@Configuration
public class RestTemplateConfig {
   @LoadBalanced
   @Bean
   public RestTemplate restTemplate() {
      PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager();
      //鏈接池最大鏈接數
      pollingConnectionManager.setMaxTotal(400);
      pollingConnectionManager.setDefaultMaxPerRoute(200);

      HttpClientBuilder httpClientBuilder = HttpClients.custom();
      httpClientBuilder.setConnectionManager(pollingConnectionManager);
      //鏈接次數
      httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
      HttpClient httpClient = httpClientBuilder.build();

      HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
            httpClient);
      // 超時時間
      clientHttpRequestFactory.setConnectTimeout(5000);
      clientHttpRequestFactory.setReadTimeout(5000);
      clientHttpRequestFactory.setConnectionRequestTimeout(5000);

      RestTemplate restTemplate = new RestTemplate();
      restTemplate.setRequestFactory(clientHttpRequestFactory);
      restTemplate.setErrorHandler(new DefaultResponseErrorHandler());

      return restTemplate;
   }
}

爲了以示區別,咱們在user模塊中修改第二個實例的返回字符串

@RestController
public class TestController {

    @GetMapping("/find")
    public String findStr() {
        return "戰國一統";
    }
}

在調用模塊中增長測試Controller

@RestController
public class BalanceController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/trace")
    public String trace() {
        return restTemplate.getForObject("http://user/find", String.class);
    }
}

啓動調用模塊

咱們不斷的點擊刷新,它就會不斷的出現春秋一統和戰國一統返回字符串。

Nacos的環境配置

咱們能夠在命名空間中設置咱們不一樣環境(好比開發,測試,線上等等)的配置,它們是相互隔離的,互不影響。

在項目中配置以下,加入咱們如今要把項目配置到開發環境中

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 9257bc96-8af7-4737-9ce1-a63da2ba2af7
  application:
    name: user

這裏須要注意的就是,咱們在填寫namespace的時候必定要配置它的命名空間ID,而不能配它的名稱,好比dev。

項目啓動後,咱們能夠看到咱們的服務如今是在dev的服務列表中.

咱們還能夠配置它到集羣中心

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 9257bc96-8af7-4737-9ce1-a63da2ba2af7
        cluster-name: GuangZhou
  application:
    name: user

啓動後,點擊詳情,能夠看到

相關文章
相關標籤/搜索