유레카 소개
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;
}
}
시험
모든 서비스 시작
유레카 인스턴스에 등록
액세스 순서