Nacos

文章目录

  • 1:配置中心
    • 1:基本配置使用
      • 0:导包
      • 1:配置
      • 2:使用
    • 2:加载多配置集
      • 1:配置
      • 2:使用
  • 2:服务发现
    • 1:服务注册与发现介绍
    • 2:服务注册
      • 1:导包
      • 2:配置
      • 3:测试
    • 3:服务调用
      • 1:导包
      • 2:配置
  • 3:负载均衡

系列文章:
Nacos-01-Nacos的简介和安装
代码地址:

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: 18080servlet:context-path: /spring:application:name: nacos_config_testcloud:nacos:config:server-addr: ip:8848namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9group: DEFAULT_GROUPname: nacos-test.ymlfile-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: 18080servlet:context-path: /spring:application:name: nacos_config_testcloud:nacos:config:server-addr: ip:8848namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9group: DEFAULT_GROUPfile-extension: ymlextension-configs:- data-id: nacos-test.ymlgroup: DEFAULT_GROUPrefresh: true- data-id: nacos-pro.ymlgroup: DEFAULT_GROUPrefresh: 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: 18081servlet:context-path: /spring:application:name: nacos_providercloud:nacos:discovery:#注册中心地址server-addr: ip:8848#注册中心命名空间namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9config:#配置中心地址server-addr: 42.193.114.46:8848#配置中心命名空间namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9#配置中心分组group: DEFAULT_GROUPfile-extension: ymlextension-configs:- data-id: nacos-test.ymlgroup: DEFAULT_GROUPrefresh: true- data-id: nacos-pro.ymlgroup: DEFAULT_GROUPrefresh: true

3:测试

3:服务调用

1:导包

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

2:配置

1:配置bootstrap.yml

server:port: 18082servlet:context-path: /spring:application:name: nacos-consumercloud:nacos:discovery:#注册中心地址server-addr: ip:8848#注册中心命名空间namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9config:#配置中心地址server-addr: ip:8848#配置中心命名空间namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9#配置中心分组group: DEFAULT_GROUPfile-extension: ymlextension-configs:- data-id: nacos-test.ymlgroup: DEFAULT_GROUPrefresh: true- data-id: nacos-pro.ymlgroup: DEFAULT_GROUPrefresh: 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:也可以进去对各实例的权重,是否上线做出判断