服务注册
在父工程路径下创建子工程,让子工程继承父工程的环境依赖。pom.xml 中添加 nacos 发现组件。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.xml
spring:
cloud:
nacos:
discovery:
# 指定nacos server地址,与本地配置nacos地址相同
server-addr: localhost:8848
application:
name: my-nacos
服务发现与调用
pom.xml 添加 discovery,完成服务发现。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置类,由于RestTemplate不会自动装载的原因,手动配置注入到IOC。RestTemplate能帮助发现provider。
@Configuration
public class ConsumerConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
通过 discoveryClient 发现注册到 nacos 中的 provider 服务。
@RestController
public class ConsumerController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/instances")
public List<ServiceInstance> instances(){
List<ServiceInstance> provider = discoveryClient.getInstances("provider");
return provider;
}
/*
//原写法没有使用RestTemplate的情况
@GetMapping("/index")
public String index(){
//调用provider服务的index方法
//1.找到provider实例
List<ServiceInstance> list = this.discoveryClient.getInstances("provider");
int index = ThreadLocalRandom.current().nextInt(list.size());
ServiceInstance serviceInstance = list.get(index);
String url = serviceInstance.getUri()+"/index";
//2.调用
return "调用了端口为"+serviceInstance.getPort()+"的服务,返回的结果是:"+ this.restTemplate.getForObject(url,String.class);
}*/
@GetMapping("/index")
public String index() {
return this.restTemplate.getForObject("http://provider/index",String.class);
}
}
负载均衡
配置类,新增 @LoadBalanced注解即可,默认轮询。ribbon无需再添加依赖。
轮询
@Configuration
public class ConsumerConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
随机
application.xml中配置,调用者中配置。
server:
port: 8180
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Nacos权重
通用代码,新增配置类NacosWeightedRule
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
//读取配置文件
}
@Override
public Server choose(Object o) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
//获取要请求的微服务名称
String name = baseLoadBalancer.getName();
//获取服务发现的相关API
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
try {
Instance instance = namingService.selectOneHealthyInstance(name);
log.info("选择的实例是port={},instance={}",instance.getPort(),instance);
return new NacosServer(instance);
} catch (NacosException e) {
e.printStackTrace();
return null;
}
}
}
application.xml配置NFLoadBalancerRuleClassName修改为配置类路径
server:
port: 8180
provider:
ribbon:
NFLoadBalancerRuleClassName: com.southwind.configuration.NacosWeightedRule