記事ディレクトリ
ユーレカ入門
Eurekaは、Netflixによって開発されたサービス検出フレームワークであり、RESTベースのサービスであり、主にAWSドメインで実行されている中間層サービスを見つけて、負荷分散と中間層サービスフェイルオーバーを実現するために使用されます。
Eurekaは、EurekaサーバーとEurekaクライアントの2つのコンポーネントで構成されています。
- Eureka Serverはサービス登録サービスを提供します。各ノードが起動すると、Eureka Serverに登録されるため、利用可能なすべてのサービスノードの情報がEureka Serverのサービスレジストリに保存され、サービスノードの情報を確認できます。インターフェイスで直感的に。
- Eurekaクライアントは、Eurekaサーバーとの対話を簡素化するJavaクライアントであり、ラウンドロビンロードアルゴリズムを使用する組み込みのロードバランサーでもあります。
アプリケーションの起動後、Eurekaサーバーにハートビートを送信します。デフォルトの期間は30秒です。Eurekaサーバーが複数のハートビートサイクル内にノードからハートビートを受信しない場合、Eurekaサーバーはこのサービスノードをサービスレジストリから送信します。削除されました。 (デフォルトは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:
2つのspringbootプロジェクトをすばやく作成します。1
つはprivoder-server(サービスプロバイダー)で
、もう1つはconsumer-server(サービスコンシューマー)です。
ここでは、AlibabaCloudのイメージアドレスを使用します。
-
ステップ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
Eurekaレジストリを構築する
-
ステップ1:Springbootプロジェクトをすばやく作成する
-
ステップ2:eurekaの依存関係をインポートする
<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
プロジェクトを開始し、Eurekaにアクセスします
サービス登録
- ステップ1:サービスプロバイダープロジェクトにeureka-client依存関係を追加します
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
- ステップ2:application.yml構成ファイルでeurekaアドレスを構成します
spring:
application:
#配置服务名称
name: userservice
eureka:
client:
service-url:
#eureka地址信息
defaultZone: http://localhost:8088/eureka
- 手順3:サービスプロバイダーを複数回起動して、マルチインスタンス展開をシミュレートする
ポートの競合を回避するためにポートを変更する-Dserver.port=8082
サービスディスカバリ
- ステップ1:サービスコンシューマープロジェクトにeureka-client依存関係を追加します
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
- ステップ2:application.yml構成ファイルでeurekaアドレスを構成します
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;
}
}
テスト
すべてのサービスを開始
するeurekaインスタンスに登録する
アクセス順序