在做分布式微服之前,先看看我的我的项目结构的目录,主要有两个Eureka服务组成的集群,其名字如图片中所示,名字就是cloud-eurka-server7001和cloud-eurka-server7001两个;第二部分为服务提供者,就是图中画红圈部分的coud-provider-payment8002和cloud-payment-8001,也是有两个服务器组成的微服集群,电脑好的通过可以多创建几个微服作为集群;最后就是微服的消费者,也可以创建多个微服作为集群,但是我电脑已经带不动了,所以仅一个,就是图中画红圈部分的cloud-consumer-order80,但是配置都是大同小异的,没什么影响。
首先说说这三者之间的关系,简单地说,而eureka(即上述所说的cloud-eurka-server7001)是中间商,而服务提供者为服务消费者提供接口调用,消费者服务和服务提供者服务都要在注册中心注册。三者之间的关系如下图所示,其中消费端与服务端相对于注册中心来说都是客户:
接下来将一步一步的实现简单Eureka分布式注册中心。
首先从服务提供者开始,也就是文件夹中的cloud-provider-payment8002和cloud-payment-8001,在创建他们的之间首先对整个项目创建一个parent工程,也就是项目目录中的cloud-2020,是一个不带框架的maven项目,全部的mudule全部依赖于这个服工程。
1.创建服务提供者
创建过程分为几个步骤(当然有些可以直接生成SpringBoot项目,但是这种方式不符合我的气质,也可以根据自己情况而定):1.创建mudule(建cloud-provider-payment8001);2.改POM文件;3.写YML;4.主启动;5.业务类
1.1创建mudule就不多说了,不要选择框架就行,把maven和编译环境配置正确就行
1.2 改POM文件,在对应的cloud-provider-payment8002下修改器pom.xml文件,就添加如下内容:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
以上是SpringBoot框架必须要有
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.3创建.yml文件,添加下文内容:
server:
port: 8001 #配置服务端口
#配置服务相关别名与配置数据源 注意:其中数据库驱动可能有坑,可以找到自己能用的,不一定要用这个
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
#配置mybatis的映射文件
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.atguigu.springcloud.entities
1.4主启动,代码比较简单,如下文所示:
@SpringBootApplication
@EnableEurekaClient
public class Payment8002 {
public static void main(String[] args) {
SpringApplication.run(Payment8002.class, args);
}
}
1.5 业务类
这一步比较关键,可以动手打,增加理解
1.数据库SQL语句,也可以自己写
CREATE TABLE payment (
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT ID,
'serial' VARCHAR(200) DEFAULT,
PRIMARY KEY(id)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
2.实体类 其中注解@Data,@AllArgsConstructor,@NoArgsConstructor需要在idea中下载一个插件lombok才能使用,setting>plugins中搜索,并下载安装
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id;
private String serial;
}
Json封装体CommonResult
@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);
}
}
3. 持久层,也就是dao层,也是分为几部
1)接口PaymentDao,最好创建一个dao包,好管理,并创建相应的接口,在里面写方法。
2)mybatis的映射文件PaymentMapper.xml 在里面写SQL语句,绑定了dao层中的方法,每个SQL语句映射一个实体类。
4.service层,接口PaymentService,直接上代码了。
public interface PaymentService {
public int create(Payment payment); //写
public Payment getPaymentById(@Param("id") Long id); //读取
}
其实现类为:
@Service
public class PaymentServiceImpl implements PaymentService {
@Resource
private PaymentDao paymentDao;
public int create(Payment payment){
return paymentDao.create(payment);
}
public Payment getPaymentById( Long id){
return paymentDao.getPaymentById(id);
}
}
5.controller层,也是直接上代码了。
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@PostMapping(value = "/payment/create")
public CommonResult create(Payment payment){
int result = paymentService.create(payment);
log.info("*****插入结果:"+result);
if (result>0){ //成功
return new CommonResult(200,"插入数据库成功",result);
}else {
return new CommonResult(444,"插入数据库失败",null);
}
}
@GetMapping(value = "/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id){
Payment payment = paymentService.getPaymentById(id);
log.info("*****查询结果:"+payment);
if (payment!=null){ //说明有数据,能查询成功
return new CommonResult(200,"查询成功",payment);
}else {
return new CommonResult(444,"没有对应记录,查询ID:"+id,null);
}
}
}
启动项目以后,最后测试一下http://localhost:8001/payment/get/