目录
Nacos Server部署
源码下载地址:https://github.com/alibaba/nacos.git
下载安装包:https://github.com/alibaba/nacos/releases
Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):sh startup.sh -m standalone
Windows启动命令(standalone代表着单机模式运行,非集群模式):startup.cmd -m standalone

本地启动后页面查看,默认用户密码都是nacos:http://127.0.0.1:8848/nacos/index.html

先不配置nacos,启动微服务consumer和order,浏览器访问consumer接口:http://localhost:8045/consumer/findOrder/1

@Configuration
public class RestConfig {
@Resource
private LoadBalancerClient loadBalancerClient;
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();;
}
}
@RestController
@RequestMapping("/consumer/")
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
@RequestMapping("/findOrder/{id}")
public ComResultEntity findOrder(@PathVariable String id){
String url="http://localhost:8046/order/findOrder/"+id;
ComResultEntity result=restTemplate.getForObject(url,ComResultEntity.class);
return result;
}
}
@RestController
@RequestMapping("/order/")
public class OrderController {
@Value("${server.port}")
String port;
@RequestMapping("/findOrder/{id}")
public ComResultEntity findOrder(@PathVariable String id){
ComResultEntity result=new ComResultEntity();
result.setId(id);
result.setName("order:"+port);
return result;
}
}
浏览器访问consumer接口:http://localhost:8045/consumer/findOrder/1

配置nacos,修改url和pom.xml:



<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动微服务consumer和order(2个),浏览器访问consumer:


发现访问失败,需要添加负载均衡器(比如ribbon),将url中服务名order-demo替换为localhost:8046或localhost:8047, 访问成功:
@Configuration
public class RestConfig {
@Resource
private LoadBalancerClient loadBalancerClient;
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
/*RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new LoadBalancerInterceptor(loadBalancerClient)));
return restTemplate;*/
}
}
浏览器访问consumer接口:http://localhost:8045/consumer/findOrder/1


nacos核心功能

nacos实例内存注册表

Map(namespacem,Map(group::serviceName,Service))

Nacos配置中心

引入maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
添加bootstrap.yml


动态感知可以使用@RefreshScope,这个配置放在配置中心的 common.yml(refresh:true)中
@RestController
@RequestMapping("/order/")
@RefreshScope //替换配置bean
public class OrderController {
@Value("${server.port}")
String port;
@Value("${common.test.age}")
Integer age;
@RequestMapping("findOrder/{id}")
public ComResultEntity findOrder(@PathVariable String id){
ComResultEntity result=new ComResultEntity();
result.setId(id);
result.setAge(age);
result.setName("order:"+port);
return result;
}
}
扩展点,模拟ribbon
修改consumer的RestConfig:
@Configuration
public class RestConfig {
@Resource
private LoadBalancerClient loadBalancerClient;
@Bean
//@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
/*RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new LoadBalancerInterceptor(loadBalancerClient)));
return restTemplate;*/
}
}
修改consumer的ConsumerController的接口findOrder:
@RequestMapping("/findOrder/{id}")
public ComResultEntity findOrder(@PathVariable String id){
//String url="http://order-demo/order/findOrder/"+id;
//模拟ribbon
String url=getUri("order-demo")+"/order/findOrder/"+id;
ComResultEntity result=restTemplate.getForObject(url,ComResultEntity.class);
System.out.println("*******************:"+url);
return result;
}
@Resource
DiscoveryClient discoveryClient;
public String getUri(String serviceName){
//调用nacos接口,获取服务实例
List<ServiceInstance> serviceInstances=discoveryClient.getInstances(serviceName);
if(serviceInstances==null||serviceInstances.isEmpty()) {
return null;
}
//轮询
int indexServer=getIndex(serviceInstances.size());
return serviceInstances.get(indexServer).getUri().toString();
}
private AtomicInteger nextIndex=new AtomicInteger(0);
private int getIndex(int modulo){
for(;;){
int current=nextIndex.get();
int next=(current+1)%modulo;
if(nextIndex.compareAndSet(current,next)&¤t<modulo){
return current;
}
}
}
浏览器访问consumer接口:http://localhost:8045/consumer/findOrder/1



被折叠的 条评论
为什么被折叠?



