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

启动后,点击详情,能够看到

相关文章
相关标签/搜索