微服务系列--nacos注册中心与服务发现

╰+攻爆jí腚メ 2022-09-04 15:57 355阅读 0赞

1、前言

终究还是到了更新关于微服务相关博客的时候了,经过挺长一段时间微服务的自主学习,现在不敢说自己熟悉微服务,但我也能略知一二。微服务嘛,其实入门之后便会发现,其实关于微服务相关的代码量其实少之又少,如果用的是SpringCloud Alibaba这一套,那代码量就更少了,微服务比较难的地方其实是在配置上面,只要配置好了,其实后面也就不关微服务的事了。好了,闲话少话,我这里并没有从SpringCloud的五大组件开始写起,而是选择从SpringCloud Alibaba开始写起,后面如果有时间,则再更新SpringCloud五大组件的内容。

2、什么是nacos

naocs其实是用java写的一个服务,相比feign,可以说是零代码,因为feign的话,一般来说都会单独使用一个工程来当注册中心,而所谓的注册中心呢,其实就是把消费者和提供者管理起来的一个容器。至于怎么启动nacos,那真的无脑启动,只需要下载后nacos后,双击启动脚本就OK了,当初我刚接触到这玩意的时候,觉得feign完全没有使用的必要了,而且比feign更加强大。

3、下载并启动nacos

下载官网:

Releases · alibaba/nacos · GitHub(直链前往)

https://github.com/alibaba/nacos/releases(网址前往)

如果下载慢,可以从我上传的资源进行下载:

nacos1.2.1.zip-Java文档类资源-CSDN下载

我这里使用的是1.2.1的版本,相对来说也比较久了,现在出到2.0以上的版本了,之所以我用这个版本呢,是因为我在刚入门的时候踩了很多坑,好多时候是因为问题出在版本不兼容上了,这是后期我整合ribbon、sentinel、gateway比较适合的一个版本。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTA5NzQ2_size_16_color_FFFFFF_t_70

下载之后进行解压,在bin目录下双击startup.cmd,看到此界面便是已成功

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTA5NzQ2_size_16_color_FFFFFF_t_70 1

打开浏览器,输入localhost:8848/nacos,打开nacos的可视化管理界面,这里有个小bug,有时候用localhost打开之后,会发现是一个空白页面,无法正常显示页面,那可以换成本地ip的方式进行打开,默认用户名和密码都是 nacos

4、创建微服务父工程

创建好SpringBoot工程后,导入所需依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.0.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <packaging>pom</packaging>
  12. <groupId>com.chen</groupId>
  13. <artifactId>SpringCloudAliBaBa_Learn</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>SpringCloudAliBaBa_Learn</name>
  16. <description>Demo project for Spring Boot</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.projectlombok</groupId>
  23. <artifactId>lombok</artifactId>
  24. <optional>true</optional>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. <exclusions>
  31. <exclusion>
  32. <groupId>org.junit.vintage</groupId>
  33. <artifactId>junit-vintage-engine</artifactId>
  34. </exclusion>
  35. </exclusions>
  36. </dependency>
  37. </dependencies>
  38. <dependencyManagement>
  39. <dependencies>
  40. <dependency>
  41. <groupId>org.springframework.cloud</groupId>
  42. <artifactId>spring-cloud-dependencies</artifactId>
  43. <version>Hoxton.SR3</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>com.alibaba.cloud</groupId>
  47. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  48. <version>2.2.1.RELEASE</version>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. <version>2.3.0.RELEASE</version>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. </project>

5、创建服务提供者模块

在创建好的SpringBoot工程下,新建一个module,名为provider,导入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>com.chen</groupId>
  7. <artifactId>SpringCloudAliBaBa_Learn</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10. <groupId>com.chen</groupId>
  11. <artifactId>provider</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>provider</name>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba.cloud</groupId>
  25. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  26. <version>2.2.1.RELEASE</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. <exclusions>
  37. <exclusion>
  38. <groupId>org.junit.vintage</groupId>
  39. <artifactId>junit-vintage-engine</artifactId>
  40. </exclusion>
  41. </exclusions>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-maven-plugin</artifactId>
  49. <version>2.3.0.RELEASE</version>
  50. </plugin>
  51. </plugins>
  52. </build>
  53. </project>

yml配置,nacos的默认地址就是 localhost:8848,这是我在研究nacos源码的时候发现的,所以说如果你是在本地,那这个配置写不写都无所谓,只要你导入了依赖,启动了nacos,那就会自动将你这个服务注册到nacos里去。

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. # 配置nacos服务地址,如果不配置,默认是localhost:8848
  6. server-addr: localhost:8848
  7. application:
  8. name: provider
  9. server:
  10. port: 8081

接下来写一个controller进行测试

  1. package com.chen.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.cloud.client.ServiceInstance;
  5. import org.springframework.cloud.client.discovery.DiscoveryClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.util.List;
  10. @RestController
  11. @RequestMapping("/provider")
  12. public class ProviderController {
  13. @Autowired
  14. private DiscoveryClient discoveryClient;
  15. @Value("${server.port}")
  16. private String port;
  17. @GetMapping("/instances")
  18. public List<ServiceInstance> instances() {
  19. List<ServiceInstance> provider = discoveryClient.getInstances("provider");
  20. return provider;
  21. }
  22. @GetMapping("/index")
  23. public String index(){
  24. return "ok--"+port;
  25. }
  26. }

第一个 instances接口,获得provider这个实例名下的所有服务,

第二个index接口,方便我后面新加一个consumer服务进行调用。

将这个服务进行运行,打开nacos,查看服务列表,可以看到这个服务已经注册进来了

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTA5NzQ2_size_16_color_FFFFFF_t_70 2

现在,我们修改这个服务的端口号,改为8082,再次运行,可以看到现在实例数已经变为2了

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTA5NzQ2_size_16_color_FFFFFF_t_70 3

接着我们调第一个接口,localhost:8081/provider/instances

或者是localhost:8082/provider/instances

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTA5NzQ2_size_16_color_FFFFFF_t_70 4

6、创建服务消费者模块

同样新建module,引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>com.chen</groupId>
  7. <artifactId>SpringCloudAliBaBa_Learn</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10. <groupId>com.chen</groupId>
  11. <artifactId>consumer</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>consumer</name>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba.cloud</groupId>
  25. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  26. <version>2.2.1.RELEASE</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. <exclusions>
  37. <exclusion>
  38. <groupId>org.junit.vintage</groupId>
  39. <artifactId>junit-vintage-engine</artifactId>
  40. </exclusion>
  41. </exclusions>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-maven-plugin</artifactId>
  49. <version>2.3.0.RELEASE</version>
  50. </plugin>
  51. </plugins>
  52. </build>
  53. </project>

yml配置

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. # 配置nacos服务地址,如果不配置,默认是localhost:8848
  6. server-addr: localhost:8848
  7. application:
  8. name: consumer
  9. server:
  10. port: 8080

我这里使用RestTemplate进行服务调用

  1. package com.chen.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. @Configuration
  6. public class ConsumerConfig {
  7. @Bean
  8. public RestTemplate restTemplate(){
  9. return new RestTemplate();
  10. }
  11. }

新建消费者controller,用来调第5步启动成功的那两个服务,这里我用随机数,先获得实例数,再根据实例数的大小随机调取服务

  1. package com.chen.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.cloud.client.ServiceInstance;
  4. import org.springframework.cloud.client.discovery.DiscoveryClient;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. import java.util.List;
  10. import java.util.concurrent.ThreadLocalRandom;
  11. @RestController
  12. @RequestMapping("/consumer")
  13. public class ConsumerController {
  14. @Autowired
  15. private DiscoveryClient discoveryClient;
  16. @Autowired
  17. private RestTemplate restTemplate;
  18. @GetMapping("/index")
  19. public String index(){
  20. List<ServiceInstance> provider = discoveryClient.getInstances("provider");
  21. int index = ThreadLocalRandom.current().nextInt(provider.size());
  22. String url = provider.get(index).getUri()+"/provider/index";
  23. return this.restTemplate.getForObject(url, String.class);
  24. }
  25. }

启动消费者,发现在nacos中也成功注册进来了

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTA5NzQ2_size_16_color_FFFFFF_t_70 5

现在调消费者的接口,localhost:8080/consumer/index

可以看到结果要么调的是 8081,要么是8082

20210815162240233.png

20210815162252936.png

nacos注册中心和服务发现搭建成功,后面持续整合微服务的其他组件~~~

发表评论

表情:
评论列表 (有 0 条评论,355人围观)

还没有评论,来说两句吧...

相关阅读

    相关 nacos服务注册发现

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容