Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。
Nacos 提供了一组简单易用的特性集,能够帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
1、Nacos下载地址和官方文档
https://github.com/alibaba/nacos/releases
https://nacos.io/zh-cn/docs/quick-start.html
2、下载对应的版本解压,最好不要解压到中文目录下,目录结构如下:
3、Nacos的默认端口是8848,如果被占用可以在conf下的application.properties文件进行更改:
4、Nacos启动方式(启动完访问http://localhost:8848/nacos/index.html账号密码都为Nacos):
第一种可以直接使用在bin目录下的startup.cmd文件进行启动。
第二种使用命令启动(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
启动服务发现:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
${latest.version}
启动配置管理:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
${latest.version}
第一步:引入服务发现和注册依赖
第二步:创建配置文件application.yml或者application.properties;实现服务注册:
#yaml文件
server:
port: 8081
spring:
application:
name: userservice #user服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848
第三步:创建启动类并启动:
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
成功注册到Nacos上
第一步:引入服务发现依赖
第二步:创建配置文件application.yml或者application.properties;实现服务注册:
#yaml文件
server:
port: 8080
spring:
application:
name: orderservice #user服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848
第三步:创建启动类
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate 并注入Spring容器 这个可以重新建一个配置类,在配置类里进行配置
*
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
第四步:编写Controller和Service
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
}
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
// 2.1.url路径
String url = "http://userservice/user/" + order.getUserId();
// 2.2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
}
1、一级是服务,例如useservice
2、二级是集群,例如HZ/SH
3、三级是实例,例如HZ机房的某台部署了userservice的服务器
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: HZ #集群名称
创建多个服务名相同,不同端口的服务,配置不同的集群;
userservice:
ribbon:
NFLoadBalanceRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则
1、配置了NacoseRule负载均衡后,服务调用将优先选择相同集群的实例。
2、本集群找不到提供者了,才回去其他集群寻找,并且会报警告。
3、确定了可用实例列表后,再采用随机负载均衡挑选实例。
1、Nacos控制台可以设置实例的权重值,0-1之间。
2、同集群内的多个实例,权重越高被访问的频率越高。
3、权重设置为0则完全不会被访问。
当要进行版本升级时,可以通过权重平滑的进行升级,先将权重比例调小,放进少部分用户进行测试升级,如果没什么问题,就可以逐渐扩大比例进行升级。
在配置文件中进行配置所在的环境:
spring:
application:
name: userservice #user服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: SH #集群名称
namespace: b59aed87-eb2d-4a7f-8962-5462382160c9 #命名空间id
通过namespace进行设置服务所在的环境,namespace的值为Nacos控制台中创建的命名空间Id
这时候,如果服务提供者和服务消费者不在同一个环境下面,那么消费者将无法调用提供者下面的方法;抛出异常:
java.lang.IllegalStateException: No instances available for userservice
第一次写博客,写的不好尽管提意见哈哈,这是我自己学习中记录的笔记,写的比较简单,后面在学习过程中会在慢慢完善,希望对大家有帮助。。