유레카 등록센터의 역할
Eureka架构
원격 통화의 두 가지 문제점
服务的ip地址和端口号写死
: 프로덕션 환경服务的地址可能会随时发生变化
, 하드 코딩된 경우 매번 코드를 수정해야 함多实例问题
: 동시성이 높은 경우一个服务可以有多个实例形成一个集群
이때 하드코딩을 사용하면 서비스의 인스턴스 주소 하나만 접근 가능
Eureka 아키텍처에서 마이크로서비스 역할은EurekaServer和EurekaClient
두 가지 범주로 나뉩니다.
EurekaServer(服务端)
: 서비스 등록 정보(서비스 이름 및 관련 인스턴스 주소 포함)를 기록하고 모든 서비스 하트비트를 모니터링할 수 있습니다.EurekaClient(客户端)
: 제공자(서비스 제공자)와 소비자(서비스 소비자)
服务提供者与消费者
서비스 호출 관계에는 서비스 제공자와 서비스 소비자가 포함되는데, 이 두 역할의 정의가 절대적이지는 않습니다.在不同业务中有些服务既可以是服务提供者也可以是服务消费者
服务提供者
: 기업 내 다른 마이크로서비스가 호출하는 서비스(다른 마이크로서비스에 인터페이스를 노출)服务消费者
: 기업 내 다른 마이크로서비스의 서비스 호출(다른 마이크로서비스에서 제공하는 인터페이스 호출)
服务消费者
원격 통화를 시작할 때 服务提供者实例的ip地址和端口号
진행 과정을 파악하고 주의를 기울이세요服务消费者也需要把自己注册到Eureka服务端后才能使用其提供的服务
第一步服务注册
: 서비스 제공자 인스턴스가 시작된 후 자신의 정보를 등록합니다.eureka-server(Eureka服务端)
第二步服务映射
: 유레카 서버는 모든 서비스에서 제공하는 이름과 해당 서비스 인스턴스 주소 간의 매핑 관계를 Map 컬렉션에 저장합니다.第三步服务发现
: 서비스 소비자는 서비스 제공자의 이름을 기반으로 유레카에서 해당 정보를 가져옵니다.一个服务可能有多个服务提供者所以最终会得到一个服务实例地址列表
第四步负载均衡
: 서비스 소비자는 로드 밸런싱 알고리즘을 사용하여 인스턴스 주소 목록에서 인스턴스 주소를 선택하고 원격 호출을 시작합니다.
서비스 소비자는 서비스 제공자의 건강상태를 어떻게 인식하는가?判断服务提供者是否宕机
第一步
: 서비스 제공자는 EurekaServer 서버에 정기적인 간격(기본값 30초)으로 하트비트 요청을 보내 서버의 상태를 보고합니다.第二步
:eureka는 하트비트 요청을 확인하여 서비스 제공자의 목록 정보를 업데이트하며, 하트비트가 비정상적인 것으로 확인되면 서비스 목록에서 제거되므로 서비스 소비자는 서비스 제공자의 최신 정보를 가져올 수 있습니다.
유레카 등록 센터 구성
搭建注册中心(EurekaServer)
첫 번째 단계는 하위 모듈 在父工程cloud-demo中创建子模块eureka-server
을 생성한 다음 SpringCloud for Eureka에서 제공하는 시작 서버 종속성을 도입하는 것입니다
<!--eureka服务端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
두 번째 단계는 시작 클래스를 작성하는 것입니다. eureka-server模块
에 시작 클래스를 작성하고 @EnableEurekaServer注解
를 추가하여 eureka-server服务
등록 센터 기능이 있습니다
- eureka-server 서비스를 포함한 모든 마이크로서비스는 등록 센터로 이동하여 자체 정보(서비스 이름 및 관련 인스턴스 주소 포함)를 등록합니다.
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class);
}
}
세 번째 단계는 구성 파일을 작성하는 것입니다. 다른 유레카 클러스터와의 통신을 용이하게 하기 위해eureka-server服务
에서 eureka-server 서비스에 자신의 서비스 이름 및 관련 인스턴스 주소 정보를 등록합니다. 통신< /span>
server:
port: 10086 # 服务端口
spring:
application:
name: eureka-server # eureka的服务名称
# eureka服务将自己的信息注册到Eureka服务端
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
4단계: 마이크로서비스를 시작하고 브라우저에서 http://localhost:10086/에 액세스합니다.
服务注册
첫 번째 단계는 종속성을 도입하는 것입니다. user-service,order-service模块
의 pom.xml 파일에 Eureka의 클라이언트 종속성을 도입합니다.spring-cloud-starter-netflix-eureka-client
<!--eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
서비스 등록의 두 번째 단계: user-service,order-service模块
의 application.yml에서 自己的服务的名称
및 구성eureka-server服务的地址信息
spring:
application:
name: userservice # 服务名称
# userservice服务将自己的信息注册到Eureka服务端
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
spring:
application:
name: orderservice # 服务名称
# orderservice将自己的信息注册到Eureka服务端
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
세 번째 단계에서는 다중 인스턴스 배포를 시뮬레이션합니다. IDEA에서 시작user-service实例
구성 복사본을 복사하고, 이름을 재설정하고, VM 옵션을 사용하여 포트 번호를 수정합니다.-Dserver.port=8082
4단계: Eureka 서버에 등록된 서비스 및 모든 관련 인스턴스 보기
서비스 호출
服务发现
첫 번째 단계는 종속성을 도입하는 것입니다. 서비스 검색 및 서비스 등록은 모두 Eureka의 클라이언트 종속성에 캡슐화됩니다. 등록 중에 종속성이 도입된 경우 다시 도입할 필요가 없습니다.
<!--eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
서비스 검색의 두 번째 단계:orderservice服务
이 eureka-server服务
에 등록되어 있는 한 <의 인스턴스 주소 목록을 가져올 수 있습니다. 나=3> userservice服务
- 등록된 Bean에
orderservice模块
시작 클래스에 로드 밸런싱 주석을 추가합니다.RestTemplate
@LoadBalanced
- 원격호출 접속 경로
order-service模块
OrderService类中的queryOrderById方法
使用服务名(userservice)代替服务实例的ip和端口
- Spring은 서비스 이름을 기반으로 Eureka 서버에서 해당 인스턴스 주소 목록을 자동으로 얻는 데 도움을 줍니다
userservice
. 그런 다음 로드 밸런싱 알고리즘을 사용하여 인스턴스 주소를 선택하고 시작합니다. 원격 통화
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.调用userservice服务远程查询User,使用服务的名称代替服务的IP地址和端口
//String url = "http://localhost:8081/user/" + order.getUserId();
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.存入查询到的user对象
order.setUser(user);
// 4.返回
return order;
}