Eureka是什么 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka入门
Eureka分为两个组件: Eureka-server端和Eureka-client端
Eureka-server提供服务发现的功能,各个微服务启动时,会向Eureka Server注册自己的信息(例如: IP、port、 微服务名称等)
Eureka-client是一个java客户端,用于简化与Eureka-server的交互(启动时,会向server注册自己的信息)
Eureka架构
1、服务启动后,会周期性(默认30秒)的向Eureka-server注册自己的信息以续约自己的“租期”
2、如果Eureka-server在一段时间内没有接收到某个微服务实例的心跳(以最后一次续约时间开始计算),Eureka-server将会注销这个实例(默认90秒)
3、默认情况下,Eureka-server同事也是Eureka-client. 多个Eureka-server实例, 互相之间通过增量复制的方式,来实现服务注册表的数据同步.
4、Eureka-server默认保证90秒内,Eureka-server集群内的所有实例数据到达一致, 从这个架构来看, Eureka-server所有实例所处的角色是对等的, 没有类似zookeeper、选举过程, 也不存在主从, 所有节点都是主节点.
5、Eureka-client会缓存注册表中的信息. 微服务无需每次请求都查询Eureka-server, 从而降低了Eureka-server的压力,其次Eureka-server所有节点都宕机了,服务消费者可以使用缓存中的信息找到服务提供者并完成调用.
Eureka搭建
1、创建spirngboot父子工程
2、父pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.spring.hello</groupId>
<artifactId>hello-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-spring</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<modules>
<module>eureka-server</module>
<module>eureka1-consumer</module>
<module>eureka1-provider</module>
</modules>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
</dependencies>
<!--引入springcloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、创建eureka服务端: eureka-server
创建module,选择springboot工程,填写相关信息
选择Cloud Discovery, 勾住Eureka Server
eureka-server创建完成
接下来创建构建pom.xml文件
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.spring.hello</groupId>
<artifactId>hello-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.george1</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在主类中, 加上注解: @EnableEurekaServer
配置文件,用的是yml:
server:
port: 9000
eureka:
client:
# 表示是否将自己注册到Eureka-server,默认为true,由于当前服务就是Eureka-server,故为false
register-with-eureka: false
# 表示是否从Eureka-server获取数据,默认为false,由于当前是单个节点,所以不需要从其他节点同步数据
fetch-registry: false
4、创建eureka生产端: eureka-provider
创建流程同eureka-server, 选择的依赖不同,选择web和dicovery
eureka-provider的pom部分代码
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
在主类中增加注解: @EnableDiscoveryClient
application.yml的配置:
server:
port: 8002
spring:
application:
name: ms-provider-order
datasource:
url: jdbc:mysql://ip:port/database_name
driver-class-name: com.mysql.jdbc.Driver
username: xxx
password: xxx
main:
allow-bean-definition-overriding: true #当遇到相同名字的时候,是否允许覆盖注册
eureka:
instance:
instance-id: ms-provider-order-8002
prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
mybatis:
configuration:
map-underscore-to-camel-case: true
provider端,使用springmvc+mybatis
controller端提供http接口
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("/queryOrdersByUserId/{userId}")
public List<OrderVo> queryOrdersByUserId(@PathVariable Integer userId){
return orderService.queryOrdersByUserId(userId);
}
}
service层和dao层处理逻辑: 根据userId从mysql查出这个用户所有的订单记录
5、创建eureka消费端: eureka-consumer
创建流程同eureka-provider
在主类中增加注解: @EnableDiscoveryClient
pom.xml文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
在主类中增加注解: @EnableDiscoveryClient
application.xml中增加配置:
server:
port: 8001
spring:
application:
name: ms-consumer-user
datasource:
url: jdbc:mysql://ip:port/database_name
driver-class-name: com.mysql.jdbc.Driver
username: xxx
password: xxx
main:
# 当遇到相同名字的时候,是否允许覆盖注册
allow-bean-definition-overriding: true
eureka:
instance:
instance-id: ms-consumer-user-8001
mybatis:
configuration:
map-underscore-to-camel-case: true
controller层通过微服务名称MS-PROVIDER-ORDER来调用生产者
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private UserServiceImpl userService;
@RequestMapping("queryUserInfoById/{userId}")
public UserInfoVo queryUserInfoByid(@PathVariable("userId") Integer userId) {
User user = userService.queryUserById(userId);
ResponseEntity<List> responseEntity = restTemplate.getForEntity("http://MS-PROVIDER-ORDER/order/queryOrdersByUserId/" + userId, List.class);
List<OrderVo> orderVoList = responseEntity.getBody();
UserInfoVo userInfoVo = new UserInfoVo();
userInfoVo.setOrderVoList(orderVoList);
userInfoVo.setUserName(user.getUserName());
return userInfoVo;
}
}
Eureka web页面展示
在浏览器中输入:
http://127.0.0.1:8001/order/queryOrdersByUserId/1
通过微服务名称来访问数据
{
"userName": "张三",
"orderVoList": [
{
"orderId": 1,
"orderMoney": 110.2,
"userId": 1
},
{
"orderId": 4,
"orderMoney": 200.5,
"userId": 1
}
]
}
本文搭建了单机的eureka的微服务,接下来的文章,小强将介绍多台eureka-server高可用架构实践和注册中心安全登录.
本文分享自 MoziInnovations 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!