Nacos-02-Nacos的配置中心和服务发现


系列文章:
Nacos-01-Nacos的简介和安装
代码地址: https://gitee.com/cangyu1024/nacos-demo

1:配置中心

1:基本配置使用

nacos配置如下,使用dev的命名空间
在这里插入图片描述

0:导包

 <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

1:配置

在bootstrap.yml中配置,他比application.yml加载的早
在这里插入图片描述

server:
  port: 18080
  servlet:
    context-path: /

spring:
  application:
    name: nacos_config_test
  cloud:
    nacos:
      config:
        server-addr: ip:8848
        namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
        group: DEFAULT_GROUP
        name: nacos-test.yml
        file-extension: yml

2:使用

package com.java1234.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/*
 * @description:
 * @author: wangkanglu 
 * @date: 2022/8/25 21:09
 * @param: 
 * @return: 
 **/
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosConfigController {
    
    

    @Value("${java.name}")
    private String name;

    @Value("${java.age}")
    private String age;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){
    
    
        return name+":"+age;
    }
}

2:加载多配置集

在这里插入图片描述

1:配置

在bootstrap.yml中配置,他比application.yml加载的早
在这里插入图片描述

server:
  port: 18080
  servlet:
    context-path: /



spring:
  application:
    name: nacos_config_test
  cloud:
    nacos:
      config:
        server-addr: ip:8848
        namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
        group: DEFAULT_GROUP
        file-extension: yml
        extension-configs:
          - data-id: nacos-test.yml
            group: DEFAULT_GROUP
            refresh: true

          - data-id: nacos-pro.yml
            group: DEFAULT_GROUP
            refresh: true


注:

  • data-id : Data Id
  • group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

2:使用

package com.java1234.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/*
 * @description:
 * @author: wangkanglu 
 * @date: 2022/8/25 21:09
 * @param: 
 * @return: 
 **/
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosConfigController {
    
    

    @Value("${java.name}")
    private String name;

    @Value("${java.age}")
    private String age;

    //这个是从nacos-pro.yml中获取的
    @Value("${java.sex}")
    private String sex;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){
    
    
        return name+":"+age+":"+sex;
    }
}

2:服务发现

1:服务注册与发现介绍

大的分布式微服务项目会根据业务,把项目拆分成多个业务模块项目,然后互相调用;
如何互相调用呢?
这里我们每个项目模块都需要去nacos服务注册中心注册下,登记下每个项目自身的地址和端口,然后其他的项目模块就可以通过Nacos找到需要调用的其他模块项目的地址了;
这样就可以实现服务的发现和调用;

在这里插入图片描述

2:服务注册

1:导包

 <!-- 服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2:配置

在bootstrap.yml中配置

server:
  port: 18081
  servlet:
    context-path: /



spring:
  application:
    name: nacos_provider
  cloud:
    nacos:
      discovery:
        #注册中心地址
        server-addr: ip:8848
        #注册中心命名空间
        namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
      config:
        #配置中心地址
        server-addr: 42.193.114.46:8848
        #配置中心命名空间
        namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
        #配置中心分组
        group: DEFAULT_GROUP
        file-extension: yml
        extension-configs:
          - data-id: nacos-test.yml
            group: DEFAULT_GROUP
            refresh: true

          - data-id: nacos-pro.yml
            group: DEFAULT_GROUP
            refresh: true


3:测试

在这里插入图片描述

3:服务调用

1:导包

<!-- openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2:配置

1:配置bootstrap.yml

server:
  port: 18082
  servlet:
    context-path: /



spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        #注册中心地址
        server-addr: ip:8848
        #注册中心命名空间
        namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
      config:
        #配置中心地址
        server-addr: ip:8848
        #配置中心命名空间
        namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
        #配置中心分组
        group: DEFAULT_GROUP
        file-extension: yml
        extension-configs:
          - data-id: nacos-test.yml
            group: DEFAULT_GROUP
            refresh: true

          - data-id: nacos-pro.yml
            group: DEFAULT_GROUP
            refresh: true


2:定义Feign接口,生成动态代理对象

package com.example.nacos_consumer.feign.provider;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author wangkanglu
 * @version 1.0
 * @description
 * @date 2022-08-25 22:11
 */
//@FeignClient(contextId = "remoteSearchService", value = ServiceNameConstants.SEARCH_CLIENT, fallbackFactory = RemoteSearchFallbackFactory.class)
@FeignClient(name = "nacos-provider")//这个注解就是指向被调用的服务
@Component
public interface RemoteHelloService {
    
    

    @RequestMapping("/provider/hello")//这个地址就是被调用服务的地址
    public String hello();
}

3:启动类加@EnableFeignClients(basePackages = “com.java1234.feign”)

开启Feign客户端支持

package com.example.nacos_consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class NacosConsumerApplication {
    
    

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

}

注:@FeignClient注解说明

value、name
value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。

contextId
我们不想将所有的调用接口都定义在一个类中,有一种解决方案就是为每个Client手动指定不同的contextId,这样就不会冲突了。

url
url用于配置指定服务的地址,相当于直接请求这个服务,不经过Ribbon的服务选择。像调试等场景可以使用。

decode404
当调用请求发生404错误时,decode404的值为true,那么会执行decoder解码,否则抛出异常。

configuration
configuration是配置Feign配置类,在配置类中可以自定义Feign的Encoder、Decoder、LogLevel、Contract等。

fallback
定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。

fallbackFactory
也是容错的处理,可以知道熔断的异常信息。

path
path定义当前FeignClient访问接口时的统一前缀,比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。

primary
primary对应的是@Primary注解,默认为true,官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着Feign Client有多个相同的Bean在Spring容器中,当我们在使用@Autowired进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。

qualifier
qualifier对应的是@Qualifier注解,使用场景跟上面的primary关系很淡,一般场景直接@Autowired直接注入就可以了。

3:负载均衡

1:负载一个完全一样的provider,只要spring.application.name是一样的,即视为同一个服务
在这里插入图片描述
2:启动两个provider和consumer
在这里插入图片描述

3:查看nacos
在这里插入图片描述
4:也可以进去对各实例的权重,是否上线做出判断
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41694906/article/details/126531544