前言
虽然说Eureka已经是时代的弃儿,但是它里面的思想依旧是值得我们去学习的。
如有说的不对的地方还请大家多多包涵,我及时整改!🇹🇭
准备条件
- 创建一个父工程引入需要的POM依赖
- 创建一个消费者,一个生产者
- 创建一个服务的注册中心,简称服务的发现中心
数据库sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for payment
-- ----------------------------
DROP TABLE IF EXISTS `payment`;
CREATE TABLE `payment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`serial` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '支付编号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
一、创建工程
1、父工程中的依赖
这里只做一些版本的控制,具体可以去看gitee上面的源代码,父pom文件中的依赖。
<properties>
<spring-boot.version>2.3.1.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.version>3.8.1</maven.compiler.version>
<spring-boot-admin.version>2.2.3</spring-boot-admin.version>
<hutool.version>5.3.7</hutool.version>
<knife4j.version>2.0.3</knife4j.version>
<jasypt.version>2.1.1</jasypt.version>
<ttl.version>2.11.4</ttl.version>
<xxl.job.version>2.2.0</xxl.job.version>
<project.version>3.9.0</project.version>
</properties>
2、创建一个Eureka服务
在父项目中创建一个新的maven工程,然后将其转换为一个springboot项目
如何转换:在二级包名下面创建一个SpringApplicationxxx下面创建一个main方法,然后在当前类上面加上注解@SpringBootApplication…
/**
* description: EurekaMain7001
* date: 2021/5/30 11:53
* author: XiaoCoder
* version: 1.0
*/
@SpringBootApplication
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
引入依赖文件
💅这里引入的依赖是spring-cloud-starter-netflix-eureka-server
,这个是服务注册中心
的依赖。
下面会说到注册者
的依赖是什么。
<!--引入commons-->
<dependency>
<groupId>cn.xiao</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<!--引入eureka的服务注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置yml文件信息
这里有朋友就会问了 hostname
是什么东西?
hostname
:带表的是你本地的 hosts
中的一个IP
地址,让其可以代替不同的机器而已。
不同的机器:稍后再说(这是一个注册中心集群的问题,此处不深究💃 )
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false # false 表示不向注册中心注册自己
fetch-registry: false #false 表示我自己就是服务注册中心,我的职责就是维护服务实例,并不去检索服务
service-url:
# 设置 eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/
配置Eureka服务端 SpringBoot启动类
在当前的Eureka上面加上一个@EnableEurekaServer
,这个注解代表当前微服务是一个Eureka服务端
/**
* description: EurekaMain7001
* date: 2021/5/30 11:53
* author: XiaoCoder
* version: 1.0
*/
@SpringBootApplication
@EnableEurekaServer //代表服务注册中心
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
至此Eureka
的服务端(注册中心)就完全配置好了
3、创建一个Provider服务提供者
说明:
我这里已经将公共数据抽取成了一个公共的模块
cloud-api-common
,具体可以查看一个gitee上面的代码
公共包结构
CommonResult:这个就相当于将后端数据进行整合返回给前段,具体直接看我下面贴的代码 ⬇️
/**
* description: Payment
* date: 2021/5/29 12:20
* author: XiaoCoder
* version: 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T>{
private Integer code;
private String message;
private T data;
public CommonResult(Integer code,String message){
this(code,message,null);
}
}
Payment:相当于是一个订单记录实体类
/**
* description: Payment
* date: 2021/5/29 12:20
* author: XiaoCoder
* version: 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id;
private String serial;
}
Provider服务提供者配置
pom文件可以直接查看cloud-provider-payment8001
1、yaml配置
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://localhost:3306/db2019?userUnicode=true?characterEncoding=utf-8&useSSL=false
username: root
password: 123456
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7003.com:7003/eureka #集群版
#是否从EurekaServer中抓取自己的注册信息,默认为true。单节点为所谓,集群必须设置为true
fetch-registry: true
# 是否将自己注册进eureka,默认为true
register-with-eureka: true
instance:
instance-id: payment8001
prefer-ip-address: true
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
mapper-locations: classpath:mapper/*.xml
type-aliases-package: cn.xiao.springcloud.entity
2、启动类的配置
@SpringBootApplication
@MapperScan("cn.xiao.dao")
@EnableEurekaClient //Eureka客户端
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
3、Controller、Service、Dao此处省略
。。。。
4、创建一个Consume服务消费者
和上述的Provider步骤基本一样,大家可以参考
注意:唯一不同的是,消费者服务是需要调用生产者的服务的
1、yaml配置
yaml配置无外乎就是配置:
- 端口号
server-port: 80
- 服务名称
spring-application-name: cloud-order-80
- 配置Eureka
eureka-client-service-url-defaultZone: http://eureka7001.com:7001/eureka
server:
port: 80
spring:
application:
name: cloud-order-80
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7003.com:7003/eureka #集群版
#是否从EurekaServer中抓取自己的注册信息,默认为true。单节点为所谓,集群必须设置为true
fetch-registry: true
# 是否将自己注册进eureka,默认为true
register-with-eureka: true
2、启动类
/**
* description: OrderMain80
* date: 2021/5/29 15:27
* author: XiaoCoder
* version: 1.0
*/
@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
3、通过RestTemplate进行调用生产者服务
/**
* description: ApplicationContextConfig
* date: 2021/5/29 15:33
* author: XiaoCoder
* version: 1.0
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //使用@LoadBalanced注解赋予了RestTemplate负载均衡的能力,你直接访问CLOUD-PAYMENT-SERVICE 这个服务号,但是下面根本不知道你访问的哪个端口号。
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4、Consume的OrderController
/**
* description: OrderController
* date: 2021/5/29 15:32
* author: XiaoCoder
* version: 1.0
*/
@RestController
@Slf4j
public class OrderController {
// 单机端口
//private static final String PAYMENT_URL = "http://localhost:8001";
private static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@PostMapping("/consumer/payment/create")
public CommonResult<Payment> create(@RequestBody Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
}
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> get(@PathVariable("id")Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
二、开启服务进行查看
开启服务顺序
EurekaMain7001、PaymentMain8001 、OrderMain80
1、查看注册中心
访问http://localhost:7001/ 进行服务注册中心查看
发送get请求
http://localhost/consumer/payment/get/1
获取到数据