Nacos

本文详细介绍了Nacos作为服务注册与发现、配置管理平台的使用,包括启动服务、访问Nacos、服务注册与调用、负载均衡、Feign远程调用以及Nacos配置管理。内容涵盖从创建服务提供者和消费者,到使用Feign进行服务调用,以及配置动态刷新和Nacos配置中心的使用。同时,文章还讨论了服务的负载均衡和故障处理策略。
摘要由CSDN通过智能技术生成

概述

        Nacos是一个应用于服务注册与发现,配置管理的平台。他孵化于Alibaba,成长于十年双十一的洪峰考验,沉淀了简单易用,稳定可靠,性能卓越的核心竞争力。

启动服务与访问

第一步:启动Nacos

  • Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
  • Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

第二步:访问Nacos

服务注册于调用入门

 生产服务创建及注册

  1. 创建服务提供者工程,继承parent工程并添加web,nacos-discovery依赖
  2. 创建并修改application.yml文件
  3. 创建启动类
  4. 启动启动类,刷新Nacos服务,检查是否注册成功

消费者服务发现与调用

  1. 在提供者工程中创建服务提供方对象,基于此对象对外提供服务
  2. 创建消费者工程,继承parent工程,并添加web,nacos-discovery依赖
  3. 创建并修改application.yml文件
  4. 创建启动类
  5. 在启动类中创建RestTemplate对象
  6. 定义消费端Controller,在此对象方法内部实现远端服务调用

服务负载均衡设计及实现

  • 修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法然后进行服务访问
@Autowired
    private LoadBalancerClient loadBalancerClient;

    @Value("${server.port:8091}")
    private String appName;

    @GetMapping("/consumer/doRestEch02")
    public String doRestEch02(){
        //获取sca-provider服务实例
        ServiceInstance choose = loadBalancerClient.choose("sca-provider");
        //url路径
        String format = String.format("http://%s:%s/provider/echo/%s", choose.getHost(), choose.getPort(), appName);
        return restTemplate.getForObject(format, String.class);
    }
  • 修改sca-provider的配置文件端口,分别以8081,8082启动 
server:
  port: 8081
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  • 启动成功后查看nacos的服务列表,检测服务是否注册成功
  •  打开浏览器对consumer服务进行访问,访问时不断刷新,检测页面数据变化

基于Feign的远程服务调用

诞生背景

服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生

Feign是什么

Feign应用实践 

  • 第一步:在服务消费方,添加项目依赖,代码如下
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.6.RELEASE</version>
  • 第二步:在启动类添加@EnableFeignClients注解,代码如下
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Bean
    @LoadBalanced
    public RestTemplate loadBalancedRestTemplate(){ return new RestTemplate();}
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
  • 第三步:定义HTTP请求API,基于此API借助OpenFeign访问远端服务,代码如下
@FeignClient(name = "sca-provider",
        contextId = "remoteProviderService",
        fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
    @GetMapping("provider/echo/{string}")
    String echoMessage(@PathVariable("string") String string);
}
  • 第四步:创建FeignConsumerController中添加feign访问,代码如下
@RestController
@RequestMapping("/consumer")
public class FeignConsumerController {
    @Autowired
    private RemoteProviderService remoteProviderService;
    @GetMapping("/echo/{msg}")
    public String doFeignEcho(@PathVariable String msg){
        return remoteProviderService.echoMessage(msg);
    }
}
  • 第五步:启动消费者服务直接通过feign客户端进行访问 

Feign配置进阶实践

  • 一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextId,服务启动就会失败,例如,假如在服务消费方再添加一个如下接口,消费方启动时就会启动失败,例如:
@FeignClient(name = "sca-provider")
public interface RemoteOtherService {
    @GetMapping("doSomeThing")
    String doSomeThing();
}
  •  此时我们需要为远程调用服务接口指定一个contextid,作为远程服务调用的唯一标识
@FeignClient(name = "sca-provider",
        contextId = "remoteProviderService")
public interface RemoteProviderService {
    @GetMapping("provider/echo/{string}")
    String echoMessage(@PathVariable("string") String string);
}
  • 还有当我们远程服务调用超时或服务器不可用时该怎么办?(在Feign应用中通过FallbackFactory接口实现类进行默认的相关处理 ) 
@Component
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {
    @Override
    public RemoteProviderService create(Throwable throwable) {
        return (msg) -> {
          return  "请稍等一万年~~~";
        };
    }
}
  • 在Feign访问接口中应用FallbackFactory对象
@FeignClient(name = "sca-provider",
        contextId = "remoteProviderService",
        fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
    @GetMapping("provider/echo/{string}")
    String echoMessage(@PathVariable("string") String string);
}
  • 在配置文件application.yml中添加配置,启动feign方式调用时服务中断处理机制
server:
  port: 8090
spring:
  application:
    name: sca-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
feign:
  hystrix:
    enabled: true

Nacos配置入门 

配置准备

  • 添加依赖
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  • 将application.yml改为bootstarp.yml(启动优先级更高) 并添加配置
      config:
        server-addr: localhost:8848
        file-extension: yml

 新建Nacos配置

  • 打开Nacos配置中心,新建配置,其中Data ID的名字要与spring.application.name的值相同

@RefreshScope注解的应用 

  • @RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新

@RefreshScope
@Slf4j
@RestController
public class ProviderLogController {
    
    @Value("${logging.level.com.jt:error}")
    private String logLevel;

    @GetMapping("/provider/log/doLog01")
    public String doLog01(){
        System.out.println("==doLog01==");
        log.trace("==trace==");
        log.debug("==debug==");
        log.info("==info==");
        log.warn("==warn==");
        log.error("==error==");
        return "log config text "+logLevel;
    }
}

Nacos配置管理模型

  • Nacos配置管理模型由三部分组成 

  1. Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境
  2. Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
  3.  Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值