前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Netfix Eureka

Spring Cloud Netfix Eureka

作者头像
程序员小强
发布2019-06-03 16:17:34
6450
发布2019-06-03 16:17:34
举报

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

代码语言:javascript
复制
<?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文件

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
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部分代码

代码语言:javascript
复制
<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的配置:

代码语言:javascript
复制
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接口

代码语言:javascript
复制
@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文件

代码语言:javascript
复制
<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中增加配置:

代码语言:javascript
复制
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来调用生产者

代码语言:javascript
复制
@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

通过微服务名称来访问数据

代码语言:javascript
复制
{
    "userName": "张三",
    "orderVoList": [
        {
            "orderId": 1,
            "orderMoney": 110.2,
            "userId": 1
        },
        {
            "orderId": 4,
            "orderMoney": 200.5,
            "userId": 1
        }
    ]
}

本文搭建了单机的eureka的微服务,接下来的文章,小强将介绍多台eureka-server高可用架构实践和注册中心安全登录.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MoziInnovations 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档