Eureka: registro y descubrimiento de servicios

Introducción a Eureka

Eureka es un marco de descubrimiento de servicios desarrollado por Netflix. Es un servicio basado en REST. Se utiliza principalmente para ubicar servicios de nivel medio que se ejecutan en el dominio de AWS para lograr el equilibrio de carga y la conmutación por error del servicio de nivel medio.

Eureka consta de dos componentes: Eureka Server y Eureka Client:

  • Eureka Server proporciona un servicio de registro de servicios. Después de que se inicie cada nodo, se registrará en Eureka Server, de modo que la información de todos los nodos de servicio disponibles se almacenará en el registro de servicios en Eureka Server y se podrá ver la información de los nodos de servicio. intuitivamente en la interfaz.
  • Eureka Client es un cliente Java que simplifica la interacción con Eureka Server. El cliente también es un equilibrador de carga incorporado que utiliza un algoritmo de carga de turno rotativo.

Después de que se inicie la aplicación, enviará un latido a Eureka Server. El período predeterminado es de 30 segundos. Si Eureka Server no recibe un latido de un nodo dentro de varios ciclos de latidos, Eureka Server enviará este nodo de servicio desde el registro de servicio. Eliminado (predeterminado 90 segundos).

Listo para trabajar

  • Paso 1:
    Crear una tabla tb_order
    en la base de datos whyorder Crear una tabla tb_user en la base de datos 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;

  • Paso 2:
    cree rápidamente dos proyectos springboot,
    uno es privoder-server (proveedor de servicios) y
    el otro es consumer-server (consumidor de servicios) .Aquí
    uso la dirección de imagen de Alibaba Cloud
    inserte la descripción de la imagen aquí

  • Paso 3: Introducir dependencias relevantes

<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>
  • Paso 3:
    cree rápidamente clases de entidad, capa Dao, capa de servicio y controlador
//实体类(两个项目的实体类一样)
//----------订单类----------
@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;
    }
}
  • Paso 4: Configurar el archivo de configuración de 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

Crear registro Eureka

  • Paso 1: cree rápidamente un proyecto springboot
    inserte la descripción de la imagen aquí

  • Paso 2: importar dependencias de eureka

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>        
</dependency>
  • Paso 3: Agregue la anotación @EnableEurekaServer
/*Eureka自动装配*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    
    

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

Paso 4: Configurar el archivo de configuración de springboot

server:
  port: 8088

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

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

Inicia el proyecto y accede a Eureka
inserte la descripción de la imagen aquí

registro de servicio

  • Paso 1: agregue la dependencia del cliente eureka al proyecto del proveedor de servicios
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	<version>2.2.6.RELEASE</version>
</dependency>
  • Paso 2: configure la dirección eureka en el archivo de configuración application.yml
spring:
  application:
  	#配置服务名称
    name: userservice

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

  • Paso 3: Inicie el proveedor de servicios varias veces para simular la implementación de varias instancias.
    inserte la descripción de la imagen aquí
    Modifique el puerto para evitar conflictos de puerto .-Dserver.port=8082
    inserte la descripción de la imagen aquí

descubrimiento de servicios

  • Paso 1: agregar la dependencia del cliente eureka al proyecto del consumidor de servicios
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	<version>2.2.6.RELEASE</version>
</dependency>
  • Paso 2: configure la dirección eureka en el archivo de configuración application.yml
spring:
  application:
  	#配置服务名称
    name: userservice

eureka:
  client:
    service-url:
      #eureka地址信息
      defaultZone: http://localhost:8088/eureka
  • Paso 3: Registre RestTemplate (una herramienta proporcionada por Spring para enviar solicitudes http)
//写在配置类中(或者启动类,因为@SpringBootApplication是复合注解它包括@SpringBootConfiguration注解)
//注入依赖
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate() {
    
    
	return new RestTemplate();
}
  • Paso 4: Modificar el código de la capa de servicio
@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;
    }
}

prueba

Iniciar todos los servicios
inserte la descripción de la imagen aquí
Registrarse en instancia eureka
inserte la descripción de la imagen aquí
Orden de acceso
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_60117382/article/details/123890601
Recomendado
Clasificación