유레카 - 서비스 등록 및 발견

유레카 소개

Eureka는 Netflix에서 개발한 서비스 검색 프레임워크로 REST 기반 서비스로 주로 AWS 도메인에서 실행되는 미들티어 서비스를 찾아 로드밸런싱 및 미들티어 서비스 장애 조치를 달성하는 데 사용됩니다.

Eureka는 Eureka Server와 Eureka Client의 두 가지 구성 요소로 구성됩니다.

  • Eureka Server는 서비스 등록 서비스를 제공하며, 각 노드가 기동된 후 Eureka Server에 등록되어 사용 가능한 모든 서비스 노드의 정보가 Eureka Server의 서비스 레지스트리에 저장되고 서비스 노드의 정보를 볼 수 있습니다. 인터페이스에서 직관적으로.
  • Eureka Client는 Eureka Server와의 상호 작용을 단순화하는 Java 클라이언트이며 라운드 로빈 로드 알고리즘을 사용하는 내장 로드 밸런서이기도 합니다.

응용 프로그램이 시작된 후 Eureka Server에 하트비트를 보냅니다. 기본 기간은 30초입니다. Eureka Server가 여러 하트비트 주기 내에서 노드로부터 하트비트를 수신하지 않으면 Eureka Server는 서비스 레지스트리에서 이 서비스 노드를 보냅니다. 제거됨 (기본값 90초).

작업 준비

  • 1단계: 데이터베이스에 tb_order
    테이블
    생성 Whyorder 데이터베이스에 tb_user 테이블 생성 Whyuser
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',
  `price` bigint(20) NOT NULL COMMENT '商品价格',
  `num` int(10) NULL DEFAULT 0 COMMENT '商品数量',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `tb_order` VALUES (101, 1, 'Apple 苹果 iPhone 12 ', 5999, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新国标电动车', 2099, 1);
INSERT INTO `tb_order` VALUES (103, 3, '骆驼(CAMEL)休闲运动鞋女', 439, 1);
INSERT INTO `tb_order` VALUES (104, 4, '小米10 双模5G 骁龙865', 3599, 1);
INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 双模5G 视频双防抖', 2999, 1);
INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷静星II ', 5449, 1);
INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人体工学电脑椅子', 799, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休闲男鞋', 319, 1);

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `tb_user` VALUES (1, '张三', '浙江省杭州市');
INSERT INTO `tb_user` VALUES (2, '李四', '浙江省宁波市');
INSERT INTO `tb_user` VALUES (3, '王五', '浙江省温州市');
INSERT INTO `tb_user` VALUES (4, '赵六', '浙江省台州市');
INSERT INTO `tb_user` VALUES (5, '田七', '浙江省金华市');
INSERT INTO `tb_user` VALUES (6, '赵八', '浙江省嘉兴市');

SET FOREIGN_KEY_CHECKS = 1;

  • 2단계:
    두 개의 springboot 프로젝트를 빠르게 생성합니다.
    하나는 privoder-server(서비스 제공자)이고
    다른 하나는 소비자-서버(서비스 소비자)입니다.
    여기에서 Alibaba Cloud의 이미지 주소를 사용합니다 .
    여기에 이미지 설명 삽입

  • 3단계: 관련 종속성 도입

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.2.0</version>
</dependency>
<!-- lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.20</version>
</dependency>
  • 3단계:
    엔티티 클래스, Dao 계층, 서비스 계층 및 컨트롤러를 빠르게 생성
//实体类(两个项目的实体类一样)
//----------订单类----------
@Data
public class Order {
    
    
    private Long id;
    private Long price;
    private String name;
    private Integer num;
    private Long userId;
    private User user;
}
//----------用户类----------
@Data
public class User {
    
    
    private Long id;
    private String username;
    private String address;
}
//---------------Dao层代码(privider-serve)---------------
@Mapper
public interface UserMapper {
    
    
    @Select("select * from tb_user where id = #{id}")
    User selectById(Long id);
}
//---------------Service层代码(privider-serve)---------------
@Service
public class UserService {
    
    
    @Autowired
    private UserMapper userMapper;

    public User queryUserById(Long id){
    
    
        User user = userMapper.selectById(id);
        return user;
    }
}
//---------------Cintroller(privider-serve)---------------
@Controller
@RequestMapping("/user")
public class UserController {
    
    
    @Autowired
    private UserService userService;

    @RequestMapping("/{id}")
    @ResponseBody
    public User queryUser(@PathVariable("id") Long userId){
    
    
        User user = userService.queryUserById(userId);
        return user;
    }
}
//---------------Dao层代码(consumer-serve)---------------
@Mapper
public interface OrderMapper {
    
    
    @Select("select * from tb_order where id = #{id}")
    Order selectById(Long id);
}
//---------------Service层代码(consumer-serve)---------------
@Service
public class OrderService {
    
    
    @Autowired
    private OrderMapper orderMapper;

    public Order queryOrderById(Long id){
    
    
        Order order = orderMapper.selectById(id);
        return order;
    }
}
//---------------Controller(consumer-serve)---------------
@Controller
@RequestMapping("/order")
public class OerderController {
    
    
    @Autowired
    private OrderService orderService;

    @RequestMapping("/{id}")
    @ResponseBody
    public Object queryOrder(@PathVariable("id") Long orderId){
    
    
        Order order = orderService.queryOrderById(orderId);
        return order;
    }
}
  • 4단계: springboot 구성 파일 구성
#provider-server配置文件
server:
  port: 8081
spring:
  datasource:
  	#参数是关于时区和字符集的
    url: jdbc:mysql://127.0.0.1:3306/whyuser?serverTimezone=UTC&useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
    username: root
    password: why0417
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  type-aliases-package: com.why.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.why: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
#consumer-server配置文件
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/whyorder?serverTimezone=UTC&useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
    username: root
    password: why0417
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  type-aliases-package: com.why.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.why: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

유레카 레지스트리 구축

  • 1단계: 스프링부트 프로젝트를 빠르게 생성
    여기에 이미지 설명 삽입

  • 2단계: 유레카 종속성 가져오기

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>        
</dependency>
  • 3단계: @EnableEurekaServer 주석 추가
/*Eureka自动装配*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

4단계: springboot 구성 파일 구성

server:
  port: 8088

spring:
  application:
    #eureka的服务名称
    name: eurekaserver

eureka:
  client:
    service-url:
      #eureka的地址信息
      defaultZone: http://localhost:8088/eureka

프로젝트 시작 및 유레카 액세스
여기에 이미지 설명 삽입

서비스 등록

  • 1단계: 서비스 제공업체 프로젝트에 유레카 클라이언트 종속성 추가
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	<version>2.2.6.RELEASE</version>
</dependency>
  • 2단계: application.yml 구성 파일에서 유레카 주소 구성
spring:
  application:
  	#配置服务名称
    name: userservice

eureka:
  client:
    service-url:
      #eureka地址信息
      defaultZone: http://localhost:8088/eureka

  • 3단계: 서비스 공급자를 여러 번 시작하여 다중 인스턴스 배포 시뮬레이션
    여기에 이미지 설명 삽입
    포트 충돌을 방지하도록 포트 수정-Dserver.port=8082
    여기에 이미지 설명 삽입

서비스 발견

  • 1단계: 서비스 소비자 프로젝트에 유레카 클라이언트 종속성 추가
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	<version>2.2.6.RELEASE</version>
</dependency>
  • 2단계: application.yml 구성 파일에서 유레카 주소 구성
spring:
  application:
  	#配置服务名称
    name: userservice

eureka:
  client:
    service-url:
      #eureka地址信息
      defaultZone: http://localhost:8088/eureka
  • 3단계: RestTemplate 등록(http 요청을 보내기 위해 Spring에서 제공하는 도구)
//写在配置类中(或者启动类,因为@SpringBootApplication是复合注解它包括@SpringBootConfiguration注解)
//注入依赖
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate() {
    
    
	return new RestTemplate();
}
  • 4단계: 서비스 계층 코드 수정
@Service
public class OrderService {
    
    
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long id){
    
    
        Order order = orderMapper.selectById(id);
        //远程调用
        //String url = "http://localhost:8081/user/"+order.getUserId();
        //用服务名代替IP端口
        String url = "http://userservice/user/"+order.getUserId();
        //发送http请求
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        return order;
    }
}

시험

모든 서비스 시작
여기에 이미지 설명 삽입
유레카 인스턴스에 등록
여기에 이미지 설명 삽입
액세스 순서
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/m0_60117382/article/details/123890601