Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。
https://blog.csdn.net/wangyunzhao007/article/details/106872831
配置中心,顾名思义,就是我们可以把我们的配置都放置在nacos。
启动nacos后,我们输入地址http://127.0.0.1:8848/nacos/,账号和密码都是nacos。
点击配置列表,然后点击右边的加号,我们会看到下图,我们可以吧我们的配置文件写到下图,还可以选择不同的样式。
以yaml为例子,我写了一个简单的配置,data ID的名字不是随便命名的,pro代表profiles.profiles
这样就弄好一个配置了,接下怎么使用呢。
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
0.2.2.RELEASE
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
0.2.2.RELEASE
package com.mayikt.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
@SpringBootApplication
public class NacosController {
@Value("${mayikt.name}")
private String userName;
@RequestMapping("/getConfig")
public String getConfig() {
return userName;
}
}
@SpringBootApplication
@RefreshScope //加上这个注解才能动态的刷新nacos配置文件的值
public class AppNacosClient {
public static void main(String[] args) {
SpringApplication.run(AppNacosClient.class);
}
}
spring:
application:
###服务的名称
name: mayikt-nacos-client
cloud:
nacos:
discovery:
###nacos注册地址
server-addr: 127.0.0.1:8848
enabled: true
config:
###配置中心连接地址
server-addr: 127.0.0.1:8848
###分组
group: DEFAULT_GROUP
###类型
file-extension: yaml
profiles:
C: pro
然后调用测试接口:得到了配置文件的信息。
新建一个父工程,下面有两个子工程,
父工程的pom依赖,子工程不需要
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
0.2.2.RELEASE
接口:
@RestController
public class MemberService {
@Value("${server.port}")
private String serverPort;
@GetMapping("/getUser")
public String getUser(Integer userId){
return "hello world!端口号为" + serverPort;
}
}
启动项
@SpringBootApplication
public class MemberApplication {
public static void main(String[] args) {
SpringApplication.run(MemberApplication.class);
}
}
application.yml
spring:
application:
###服务名称
name: meitemk-member
cloud:
nacos:
discovery:
###注册地址
server-addr: 127.0.0.1:8848
server:
port: 8081
接口:不同的获取服务的方法和负载均衡实现
package com.mayimk.service;
import com.mayimk.loadbalance.LoadBalancer;
import com.sun.jndi.toolkit.url.Uri;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Primary;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.List;
@RestController
public class OrderService1 {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancer loadBalancer;
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/orderToMeber1")
public Object orderToMeber(){
//1.根据服务名称从注册中心获取集群列表地址
List instances = discoveryClient.getInstances("meitemk-member");
//2.列表中任意选取一个,实现本地的rpc调用 采用负载均衡算法实现
ServiceInstance serviceInstance = loadBalancer.getSingleAddres(instances);
URI recMemberUrl = serviceInstance.getUri();
String result = restTemplate.getForObject(recMemberUrl +"/getUser", String.class);
System.out.println(serviceInstance.getPort());
return "订单调用返回结果:"+ result;
}
//使用rabbion实现负载均衡
@RequestMapping("/orderToRibbonMeber")
public Object orderToRibbonMeber(){
String result = restTemplate.getForObject("http://meitemk-member/getUser", String.class);
return "订单调用返回结果:"+ result;
}
/**
*
* @return
*/
//cloud根据服务id实现负载均衡
@RequestMapping("/loadBalanceClientvMember")
public Object LoadBalanceClientvMember(){
ServiceInstance result = loadBalancerClient.choose("meitemk-member");
return result;
}
}
本地负载均衡策略需要的代码:
package com.mayimk.loadbalance;
import org.springframework.cloud.client.ServiceInstance;
import java.util.List;
public interface LoadBalancer {
/**
* 从注册中心集群列表中获取单个地址
* @param serviceInstances
* @return
*/
ServiceInstance getSingleAddres(List serviceInstances);
}
package com.mayimk.loadbalance;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class RotationLoadBalancer implements LoadBalancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public ServiceInstance getSingleAddres(List serviceInstances) {
//从零开始计数
int index = atomicInteger.incrementAndGet() % serviceInstances.size();
ServiceInstance serviceInstance = serviceInstances.get(index);
return serviceInstance;
}
}
启动项
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
/**
* 加上@LoadBalanced,注解就可以实现我们本地的负载均衡
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
application.yml
spring:
application:
###服务名称
name: meitemk-order
cloud:
nacos:
discovery:
###注册地址
server-addr: 127.0.0.1:8848
server:
port: 8082
然后我们启动两个子项目,然后修改member的端口号,将member再次启动,就会有两个不同端口号member。
我们可以看到nacos的服务列表中油member的服务实例有两个,然后order也注册到这里,也拉取了服务。我们可以调用order中的接口,接口调用了member中getUser接口,同时使用了负载均衡。
测试其中使用了rabbin方式的负载均衡,测试结果如下:
代码资源下载地址:
https://download.csdn.net/download/wangyunzhao007/12540939