Nacos(全称为"Nano Service")是一个用于动态服务发现、配置管理和服务元数据的开源平台。它由阿里巴巴集团于2018年开源,并逐渐成为云原生应用中的重要组件之一。
Nacos提供了以下主要功能:
1. 服务发现和注册:Nacos允许服务实例自动注册和发现,使得服务之间的通信更加简单和高效。它支持多种服务发现方式,包括基于DNS和基于HTTP的方式。
2. 动态配置管理:Nacos可以集中管理应用程序的配置信息,通过动态刷新机制,使得配置的变更可以实时生效,而不需要重启应用程序。这样可以大大简化了应用程序的配置管理和维护。
3. 服务元数据管理:Nacos可以为服务实例提供一些额外的元数据信息,包括权重、健康检查等。这些元数据信息可以用于实现更灵活的服务路由、负载均衡等功能。
4. 服务路由:Nacos提供了灵活的服务路由配置功能,可以根据服务实例的元数据信息和路由规则进行动态的路由配置,以实现更复杂的服务调用策略。
5. 服务限流和降级:Nacos可以通过配置的方式实现服务限流和降级功能,保护系统在高并发情况下的稳定性和可用性。
总的来说,Nacos是一个用于构建云原生架构的核心组件,它为微服务架构提供了强大的动态服务发现和配置管理能力,帮助开发者简化了应用程序的开发和运维工作。
Releases · alibaba/nacos · GitHub
进入nacos的bin目录使用cmd
执行下面命令
startup.cmd -m standalone
如果提示此处不应该有命令 提示用jdk 1.8版本以上
打开
启动成功
登录
输入账号密码
账号密码都是nacos
项目结构
在service中的pom.xml中加入依赖
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
如果用的是网线的话关闭WLAN
之前用过虚拟机的话关闭虚拟机网络
- server.port=8081
- spring.application.name=product
- #设置注册中心的地址
- spring.cloud.nacos.discovery.server-addr=localhost:8848
-
-
-
- server.port=8082
- spring.application.name=product
- #设置注册中心的地址
- spring.cloud.nacos.discovery.server-addr=localhost:8848
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-loadbalancerartifactId>
- dependency>
- package org.example.controller;
-
- import org.example.entity.Product;
- import org.example.service.ProductOpenFeign;
- import org.springframework.cloud.client.ServiceInstance;
- import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
-
- import javax.annotation.Resource;
-
-
- @RequestMapping
- @RestController
- public class OrdersController {
- @Resource
- private LoadBalancerClient loadBalancerClient;
- @Resource
- private RestTemplate restTemplate;
-
-
- /**
- * 轮询
- * @param pid
- * @return {@link Object}
- */
- @GetMapping("/order1/{pid}")
- public Object order(@PathVariable Integer pid) {
- ServiceInstance choose = loadBalancerClient.choose("product");
- String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() +"/pro/"+ pid);
- System.out.println(url);
- Product forObject = restTemplate.getForObject(url, Product.class);
- return forObject;
- }
-
- }
@EnableDiscoveryClient // 当前的微服务是可以被nacos发现的
- @Resource
- private DiscoveryClient discoveryClient;
-
- /**
- * 随机
- * @param pid
- * @return {@link Object}
- */
- @GetMapping("/order2/{pid}")
- public Object addOrder3(@PathVariable Integer pid){
- List
pro = discoveryClient.getInstances("product"); - int size = pro.size();
- int i = new Random().nextInt(size);// =size-1
- ServiceInstance choose = pro.get(i);
- String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
- System.out.println(url);
- Product forObject = restTemplate.getForObject(url, Product.class);
- return forObject;
- }
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
写一个ProductOpenFeign接口
- @FeignClient(value = "product")
- public interface ProductOpenFeign {
-
- @GetMapping("/pro/{pid}")
- public Product getProductByID(@PathVariable Integer pid);
- }
在orders的启动类中加入注解
@EnableFeignClients//使用openFeign
- @Resource
- private ProductOpenFeign productOpenFeign;
-
- /**
- * 使用openFeign
- * @param pid
- * @return {@link Product}
- */
- @GetMapping("/order3/{pid}")
- private Product order3(@PathVariable Integer pid){
- Product productByID = productOpenFeign.getProductByID(pid);
- return productByID;
- }
- public class LoadBalancerConfig {
- @Bean
- ReactorLoadBalancer
randomLoadBalancer(Environment environment, - LoadBalancerClientFactory loadBalancerClientFactory) {
- String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //loadbalancer.client.name
- // 对应的需要进行负载均衡的名字是什么
- System.out.println("======"+name);
- // product
- return new RandomLoadBalancer(loadBalancerClientFactory.
- getLazyProvider(name, ServiceInstanceListSupplier.class), name);
- }
- }
在orders的启动类中添加注解
@LoadBalancerClient(value = "product",configuration = LoadBalancerConfig.class)
加入依赖
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
- dependency>
- @Service
- public class ProductOpenFeignImpl implements ProductOpenFeign {
- @Override
- public Product getProductByID(Integer pid) {
-
- return new Product(0,"有错误!");
- }
- }
@FeignClient(value = "product",fallback = ProductOpenFeignImpl.class)