微服务学习系列二:Nacos实现注册中心

系列文章目录


第一章 Nacos实现配置中心

第二章 Nacos实现注册中心


目录

系列文章目录

前言

一、服务发现和服务健康监测

二、使用步骤

1.启动服务发现

2.引入相关依赖

3.application.properties 配置

4.演示代码

5.nacos 服务列表

6.Consumer 应用

7.OpenFeign 的使用

8.@FeignClient标签的常用属性如下

9.@FeignClient FallBack降级

10.@FeignClient FallBackFactory降级

总结

参考



前言

欢迎来到 Nacos 的世界!

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

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

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。


一、服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

二、使用步骤

1.启动服务发现

本节通过实现一个简单的 echo service 演示如何在您的 Spring Cloud 项目中启用 Nacos 的服务发现功能,如下图示:

2.引入相关依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>

3.application.properties 配置

server.port=8081
spring.application.name=nacos-prodiver
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

4.演示代码

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能

代码如下(示例):

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        SysConfig sysConfig = applicationContext.getBean(SysConfig.class);

        System.out.println("user name :" + sysConfig.getName() + "; age: " + sysConfig.getAge());

        System.in.read();
    }

    @RestController
    public class EchoController {
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }
}

5.nacos 服务列表

6.Consumer 应用

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成

application.properties

server.port=8082
spring.application.name=nacos-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

代码演示

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

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

    /**
     * 实例化 RestTemplate 实例
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

        @GetMapping("/echo/app-name")
        public String echoAppName() {
            //使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
            String url = String.format("http://nacos-prodiver/echo/%s", "hello world");
            System.out.println("request url:" + url);
            return restTemplate.getForObject(url, String.class);
        }
    }
}

7.OpenFeign 的使用

引入POM

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-core</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.netflix.archaius</groupId>
            <artifactId>archaius-core</artifactId>
            <version>0.7.6</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
EchoService
@FeignClient(name = "nacos-prodiver")
public interface EchoService {

    @GetMapping(value = "/echo/{string}")
    String echo(@PathVariable String string);
}

启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {

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

    /**
     * 实例化 RestTemplate 实例
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    public class NacosController {
        @Resource
        private EchoService echoService;

        @GetMapping("/echo/app-name")
        public String echoAppName() {
            return echoService.echo("nacos");
        }
    }
}

8.@FeignClient标签的常用属性如下

  • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • url: url一般用于调试,可以手动指定@FeignClient调用的地址
  • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
  • path: 定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用

9.@FeignClient FallBack降级

不推荐:不能捕获异常打印堆栈信息,不利于问题排查

1.首先:我们在启动类里面加入注解,声明开启Feign的远程调用,如下: 

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {

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

    /**
     * 实例化 RestTemplate 实例
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    public class NacosController {
        @Resource
        private EchoService echoService;

        /**
         * http://127.0.0.1:8082//echo/app-name
         */
        @GetMapping("/echo/app-name")
        public String echoAppName() {
            return echoService.echo("nacos");
        }
    }
}

2.编写接口类,value="/echo"就是我们服务方暴露的接口地址,如下: 

@FeignClient(name = "nacos-prodiver",fallback = EchoServiceFallBack.class)
public interface EchoService {

    @GetMapping(value = "/echo/{string}")
    String echo(@PathVariable String string);
}

 3.编写熔断类,发生错误时回调:

@Component
public class EchoServiceFallBack implements EchoService {
    @Override
    public String echo(String string) {
        return string + " fall back";
    }
}

4.定义配置信息: 

feign:
  client:
    config:
      metaDataClient:
        connect-timeout: 3000
        read-timeout: 3000
  hystrix:
    enabled: true

10.@FeignClient FallBackFactory降级

fallbackFactory 推荐:可以捕获异常信息并返回默认降级结果。可以打印堆栈信息。

@FeignClient(name = "nacos-prodiver",fallbackFactory = EchoServiceFactory.class)
public interface EchoService {

    @GetMapping(value = "/echo/{string}")
    String echo(@PathVariable String string);
}
@Component
public class EchoServiceFactory implements FallbackFactory<EchoService> {
    @Override
    public EchoService create(Throwable throwable) {
        return new EchoService() {
            @Override
            public String echo(String string) {
                return string + " fall back factory";
            }
        };
    }
}


总结

参考

Nacos discovery · alibaba/spring-cloud-alibaba Wiki · GitHub

猜你喜欢

转载自blog.csdn.net/yangyanping20108/article/details/129086390