继续之前的内容往下开发,之前内容传送门
项目源码:https://gitee.com/zhangchouchou/spring-cloud-demo
一、Eureka 注册中心
注册中心在整个 spring cloud 系统中扮演着非常重要的角色,比如远程调用、负载均衡等必须有注册中心参与其中才能实现。
Eureka 采用 CS设计结构
,管理服务与服务之间依赖关系,以实现服务调用、负载均衡、容错等,实现服务的注册与发现。
CS:Client Server 即客户机与服务器结构。客户机需要安装专门的软件。
BS:Browser server 即浏览器与服务器结构。web浏览器与服务器的交互。
Eureka 两个组件:
- Eureka Server 提供服务注册服务
各个微服务节点通过配置启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
- Eureka Client 通过注册中心进行访问
是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会在 Eureka Server 发送心跳(默认周期30秒)。如果Eureka Server 在多个心跳周期内没有收到某个节点的心跳,Eureka Server 将会从服务器注册表中把这个服务节点移出(默认90秒)
概括
Eureka 可以类比做房屋中介,服务提供者就是房东,服务消费者就是租客。房东和租客将信息注册到 Eureka,Eureka 负责将房东和租客搭桥,使租客能够找到房东。
不过Eureka现在已经停止更新了,最新版本就是 2.*,电商项目中基本都使用 Nacos 代替。但 Eureka 依旧还需要掌握和了解。
二、搭建单机版 Eureka ,IDEA生成 Eureka Server 端服务注册中心
流程概括
- 搭建 Eureka 服务端(建造房屋中介,端口号7001)
- 创建 Eureka 客户端,实现服务提供者(创建房东,端口号8001)
- 创建 Eureka 客户端,实现服务消费者(创建租客,端口号80)
1. 建 Module ,改 POM
使用 maven 方式创建,这样可以控制 spring boot 版本,因为 spring boot 版本和 spring cloud 版本有对应关系,防止自动创建时 spring boot 版本选择时没有合适的版本,模块命名为 : cloud-eureka-server7001
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloudDemo</artifactId>
<groupId>org.zjh.springclouddemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-eureka-server7001</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!--引入 Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--自定义API-->
<dependency>
<groupId>org.zjh.springclouddemo</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<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.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--小辣椒-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
2. 编写 YML
server:
port: 7001
eureka:
instance:
#主机名称
hostname: localhost
client:
# 是否往eureka注册(服务端,所以为false)
register-with-eureka: false
# 是否获取注册信息(服务端,所以不需要)
fetch-registry: false
# server端地址
service-url:
defaultZone: http://localhost:7001/eureka
3. 添加启动类
添加包,包名与其余模块的包名保持一致
@SpringBootApplication
//开启 Eureka Server 端服务,声明当前的微服务是注册中心
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
4. 测试是否添加成功
启动 EurekaApplication ,打开浏览器,输入 http://localhost:7001/
至此,Eureka服务端搭建完成。
三、搭建Eureka客户端,创建服务提供者
1. 新建模块,修改 POM
新建模块 cloud-provider-payment8001
,端口号 8001。
POM 中新增引用,完整 POM 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloudDemo</artifactId>
<groupId>org.zjh.springclouddemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8001</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!--引入 Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<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>
<!--自定义API-->
<dependency>
<groupId>org.zjh.springclouddemo</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2. 编写 YML
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/s_c_d?userUnicode=true&characterEncoding=utf-8&userSSL=false
username: root
password: root
mybatis:
# mapper-locations: classpath:/mapper/*.xml
type-aliases-package: org.zjh.provider.entities
eureka:
client:
# 是否注册到eureka
register-with-eureka: true
# 是否发现相关服务
fetch-registry: true
# 指定路径
service-url:
defaultZone: http://localhost:7001/eureka
3. 添加启动类
注意包名保持一致,我的是 org.zjh.springcloud
在启动类上添加 @EnableEurekaClient
注解
@SpringBootApplication
// Eureka客户端
@EnableEurekaClient
public class ProviderSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderSpringBootApplication.class,args);
}
}
4. 添加业务处理逻辑
添加 Mapper、Service 等业务处理层,此处省略,只关注 Controller
完整代码可在码云上查看,链接:传送门
@RestController
@Slf4j
public class UserController {
@Autowired
private UserService usersvice;
@GetMapping("/user/get/{id}")
public CommonResult<User> getByID(@PathVariable("id")Integer id){
User user = usersvice.getByID(id);
log.info("******* 查询结果 *******" + user);
if(user != null){
return new CommonResult(200,"查询成功",user);
}else{
return new CommonResult(444,"没有记录,查询ID:" + id,null);
}
}
@PostMapping("/user/addByUser")
public CommonResult<User> addByUser(@RequestBody User user){
boolean boo = usersvice.addByUser(user);
log.info("******* 添加结果 *******" + boo);
if(boo){
return new CommonResult(200,"添加成功",boo);
}else{
return new CommonResult(444,"添加失败",boo);
}
}
}
5. 测试是否添加成功
启动服务,刷新注册中心
红字大意是说链接不安全,不用管,看到红框中的第二行 CLOUD-PAYMENT-SERVICE
证明添加成功。该服务名为 YML 文件中配置
四、搭建Eureka客户端,创建服务消费者
cloud-consumer-order80 注册进 Eureka Server 成为服务消费者 Comsumer。
1. 在 YML 中添加配置
创建流程和 POM 引入省略,详细代码可在码云中查看:传送门
server:
port: 80
spring:
application:
name: cloud-consumer-order80
eureka:
client:
# 是否注册到eureka
register-with-eureka: true
# 是否发现相关服务
fetch-registry: true
# 指定路径
service-url:
defaultZone: http://localhost:7001/eureka
2. 添加启动类
注意服务消费者需要添加注解 @EnableEurekaClient
@SpringBootApplication
// Eureka客户端
@EnableEurekaClient
public class ConsumerSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerSpringBootApplication.class,args);
}
}
3. 添加配置类
添加配置类 RestTemplate
用于进行模块间调用
@SpringBootConfiguration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
4. 添加 Controller
注意 Controller 中是如何进行模块间调用的
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@PostMapping("/consumer/user/addByUser")
public CommonResult<User> addByUser(User user){
return restTemplate.postForObject(PAYMENT_URL + "/user/addByUser",user,CommonResult.class);
}
@GetMapping("/consumer/user/get/{id}")
public CommonResult<User> getByID(@PathVariable("id")Integer id){
return restTemplate.getForObject(PAYMENT_URL + "/user/get/" + id,CommonResult.class);
}
}
5. 启动服务进行测试
启动服务,注意 Eureka 服务端为启动状态,启动时先启动服务端再启动客户端
再次访问 http://localhost:7001/
,刷新界面,发现服务已经注册进来
五、测试
现在,服务消费者和提供者都已经成功在注册中心注册
在消费者查询一下检验能否拿到数据
查询成功。至此,Eureka服务中心搭建成功。