服务注册与发现通俗解释
什么是服务注册与发现?
可以把服务注册与发现想象成一个"电话黄页"系统:
服务注册:就像新开一家餐厅需要在黄页上登记自己的电话号码和地址
服务发现:就像你想找餐厅时,查看黄页找到对应的电话号码
详细过程解析
1. 服务注册过程
步骤1:服务启动时自动注册
当微服务启动时,它会自动向Nacos注册中心注册自己的信息:
服务A启动 → 向Nacos注册自己的信息 → Nacos保存服务A的信息
// 在application.yml中配置Nacos注册中心地址
spring:
application:
name: cart-service # 服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务器地址
// 在启动类上添加注解
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现功能
public class CartApplication {
public static void main(String[] args) {
SpringApplication.run(CartApplication.class, args);
}
}
当 cart-service 启动时,它会自动向Nacos注册:
服务名称:cart-service
IP地址:本机IP
端口号:配置的端口(如8081)
健康状态:健康
2. 服务发现过程
步骤2:服务调用时自动发现
当一个服务需要调用另一个服务时:
服务B需要调用服务A → 向Nacos查询服务A的信息 → Nacos返回服务A的地址 → 服务B调用服务A
// 在需要调用其他服务的地方使用Feign客户端
@FeignClient(value = "cart-service") // 指定要调用的服务名称
public interface CartClient {
@GetMapping("/carts") // 对应的接口路径
List<Cart> queryMyCarts();
}
// 在Controller中使用Feign客户端
@RestController
public class OrderController {
@Autowired
private CartClient cartClient; // 注入Feign客户端
@GetMapping("/order/create")
public String createOrder() {
// 当调用这行代码时,会发生以下过程:
List<Cart> carts = cartClient.queryMyCarts();
// 1. Spring Cloud根据@FeignClient("cart-service")知道要调用cart-service
// 2. 向Nacos查询cart-service的地址
// 3. Nacos返回cart-service的IP和端口(如192.168.1.100:8081)
// 4. 向http://192.168.1.100:8081/carts发送请求
// 5. 返回结果给当前服务
return "订单创建成功";
}
}
完整示例演示
示例场景:
假设我们有两个服务:用户服务(user-service)和购物车服务(cart-service)
1. 购物车服务(cart-service):
// CartApplication.java
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
public class CartApplication {
public static void main(String[] args) {
SpringApplication.run(CartApplication.class, args);
System.out.println("购物车服务启动成功,已注册到Nacos");
}
}
// CartController.java
@RestController
@RequestMapping("/carts")
public class CartController {
@GetMapping
public List<String> getMyCarts() {
System.out.println("购物车服务被调用");
return Arrays.asList("商品1", "商品2", "商品3");
}
}
2. 用户服务(user-service)调用购物车服务:
// UserApplication.java
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
@EnableFeignClients // 启用Feign客户端
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
System.out.println("用户服务启动成功,已注册到Nacos");
}
}
// CartClient.java - Feign客户端
@FeignClient("cart-service") // 要调用的服务名称
public interface CartClient {
@GetMapping("/carts") // 购物车服务的接口路径
List<String> getMyCarts();
}
// UserController.java
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private CartClient cartClient;
@GetMapping("/{userId}/cart")
public List<String> getUserCart(@PathVariable Long userId) {
System.out.println("用户服务准备调用购物车服务");
// 这里会自动完成服务发现过程
List<String> carts = cartClient.getMyCarts();
System.out.println("成功获取到购物车数据:" + carts);
return carts;
}
}
实际执行流程
当访问 http://localhost:8082/users/1/cart 时:
用户服务启动时:向Nacos注册:服务名=user-service,地址=localhost:8082
购物车服务启动时:向Nacos注册:服务名=cart-service,地址=localhost:8081
请求处理过程:
客户端请求 → 用户服务(/users/1/cart)
↓
UserController调用cartClient.getMyCarts()
↓
Feign发现需要调用"cart-service"
↓
向Nacos查询"cart-service"的地址
↓
Nacos返回地址:localhost:8081
↓
Feign向http://localhost:8081/carts发送请求
↓
购物车服务返回数据
↓
用户服务接收数据并返回给客户端
1669

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



