青岛网站设计制作婚纱摄影网页制作
文章目录
- 搭建 Eureka Server
- 创建 eureka-server 子模块
- 引入依赖
- 项目构建插件
- 完善启动类
- 编写配置文件
- 启动服务
- 服务注册
- 引入 eureka-client 依赖
- 完善配置文件
- 启动服务
- 服务发现
- 引入依赖
- 完善配置文件
- 远程调用
- 启动服务
- Eureka 和 Zookeeper 区别
搭建 Eureka Server
Eureka Server 是一个独立的微服务
创建 eureka-server 子模块

引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
项目构建插件
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
</build>
完善启动类
package org.example.eureka; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); }
}
编写配置文件
server: port: 10010
spring: application: name: eureka-server
eureka: instance: hostname: localhost client: fetch-registry: false register-with-eureka: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
fetch-registry:表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-with-eureka:表示是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而设置为false
启动服务
启动服务,访问注册中心: http://127.0.0.1:10010/

- 可以看到,
eureka-server已经启动成功了
服务注册
接下来我们把 product_service 注册到 eureka—server 中
引入 eureka-client 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
完善配置文件
spring: application: name: product-service
eureka: client: service-url: defaultZone: http://127.0.0.1:10010/eureka
启动服务
刷新注册中心: http://127.0.0.1:10010/

- 可以看到
product-service已经注册到eureka上了
服务发现
接下来我们修改 order-service,在远程调用时,从 eureka-server 拉取 product-service 的服务信息,实现服务发现
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
完善配置文件
服务发现也需要知道 eureka 地址,因此配置内容依然与服务注册一致,都是配置 eureka 信息
spring: application: name: order-service
eureka: client: service-url: defaultZone: http://127.0.0.1:10010/eureka
远程调用
远程调用时,我们需要从 eureka-server 中获取 product-service 的列表(可能存在多个服务),并选择其中一个进行调用
package org.example.order.service; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.example.order.mapper.OrderMapper;
import org.example.order.model.OrderInfo;
import org.example.order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.eureka.EurekaServiceInstance;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import java.util.List; @Slf4j
@Service
public class OrderService { @Autowired private OrderMapper orderMapper; @Resource private DiscoveryClient discoveryClient; @Autowired private RestTemplate restTemplate; public OrderInfo selectOrderById(Integer orderId) { OrderInfo orderInfo = orderMapper.selectOrderById(orderId); //String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId(); // 根据应用名称获取服务列表 List<ServiceInstance> instances = discoveryClient.getInstances("product-service"); // 服务可能有多个,获取第一个 EurekaServiceInstance instance = (EurekaServiceInstance) instances.get(0); log.info(instance.getInstanceId()); // 拼接 URL String url = instance.getUri() + "/product/" + orderInfo.getProductId(); ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class); orderInfo.setProductInfo(productInfo); return orderInfo; }
}
启动服务
刷新注册中心: http://127.0.0.1:10010/

- 可以看到
order-service已经注册到eureka上了
访问接口: http://127.0.0.1:8080/order/1
可以看到,远程调用也成功了:
Eureka 和 Zookeeper 区别
Eureka 和 Zookeeper 都是用于服务注册和发现的工具,区别如下:
Eureka是NetFlix开源的项目,而Zookeeper是Apache开源的项目Eureka基于AP原则,保证高可用,Zookeeper基于CP原则,保证数据一致性Eureka每个节点都是均等的,Zookeeper的节点区分Leader和Follower或Observer,也正因为这个原因,如果Zookeeper的Leader发生故障时,需要重新选举,选举过程集群会有短暂时间的不可用
