Spring Cloud的服务发现框架——Eureka

SpringCloud是一系列框架的集合,简化了分布式系统开发,包括服务发现、配置中心等功能。微服务架构是独立服务的集合,通过轻量级通信协同工作。SpringCloud提供了如Eureka这样的服务注册与发现工具。文章通过一个简单的订单查询案例介绍了微服务间的调用,并展示了如何设置Eureka服务器和客户端,以及如何实现Eureka的高可用性。

一、springcloud简介

1.什么是springcloud

        百度百科的解释为,Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

        那么springcloud是什么呢,简单地说,springcloud就是官方封装的一整套的对于分布式微服务的技术解决方案。

2.什么是微服务架构

        微服务架构是一项在云中部署应用和服务的新技术。微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程的架构。

微服务的具体特征

  1. 一些列的独立的服务共同组成系统

  2. 单独部署,跑在自己的进程里

  3. 每个服务为独立的业务开发

  4. 分布式的管理

3.springcloud的作用

        Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,领导选举,分布式会话,群集状态)。分布式系统的协调导致锅炉板模式。
        使用Spring Cloud开发人员可以快速站出实现这些模式的服务和应用程序。他们可以在任何分布式环境中运行良好,包括开发人员自己的电脑,裸机数据中心和托管平台。

二、微服务简单案例

        用户查询一个订单,向订单微服务发送请求,而订单信息中包含了商品信息,那么订单微服务将需要调用商品微服务。

@Configuration
public class RestTemplateConfig {

    /**
     * 创建RestTemplate交给容器
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

订单微服务调用商品微服务

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public Order getOrderById(Long id) {
        Order order = orderMapper.selectById(id);
        //调用商品微服务获得商品信息
        ResponseEntity<Product> entity = restTemplate.getForEntity("http://localhost:8081/product/" + order.getProductId(), Product.class);
        order.setProduct(entity.getBody());
        return order;
    }
}

这样就完成了一个简单的微服务案例

三、Eureka注册中心

1.服务注册和发现机制

服务注册:
服务提供者将所提供服务的信息(服务器IP和端口、服务访问协议等)注册/登记到注册中心

服务发现:
服务消费者能够从服务中心获取到较为实时的服务列表,然后根据一定的策略选择一个服务访问。

2.springcloud版本

         Spring Cloud 的版本号并不是我们通常见的数字版本号,而是一些很奇怪的单词。这些单词均为英国伦敦地铁站的站名。同时根据字母表的顺序来对应版本时间顺序,比如:最早 的 Release 版本 Angel,第二个 Release 版本 Brixton(英国地名),然后是 Camden、 Dalston、Edgware、Finchley、Greenwich、Hoxton。

官网中有着Spring Cloud版本对应的springboot版本,可以根据自身springboot版本进行选择

我这里用Hoxton版

<properties>
   <java.version>8</java.version>
   <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>

springboot版本

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.4.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>

同时固定springcloud依赖版本

<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-dependencies</artifactId>
         <version>${spring-cloud.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>

3.创建Eureka服务器项目

在上述案例的基础上,创建Eureka服务器,大体结构如下

其中common_cloud_1为公共资源,存放了其余项目的实体类以及其他共享资源

在eureka-server项目pom文件中
继承父项目

<parent>
    <groupId>com.blb</groupId>
    <artifactId>springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

配置文件

server.port=8888
# 注册中心的地址
eureka.instance.hostname=127.0.0.1
# 是否拉取服务清单
eureka.client.fetch-registry=false
# 是否注册到eureka
eureka.client.register-with-eureka=false
# 定义注册中的服务地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

 启动类上加@EnableEurekaServer

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

此时可以启动服务器项目,在浏览器中访问127.0.0.1:8888

4.配置Eureka客户端 

同样继承父项目

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置文件

# 服务名称
spring.application.name=order-service
# 配置eureka客户端是否注册到eureka
eureka.client.register-with-eureka=true
# 拉取服务清单
eureka.client.fetch-registry=true
# 注册中心地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8888/eureka

启动类添加注解@EnableEurekaClient或@EnableDiscoveryClient

@EnableEurekaClient
@SpringBootApplication
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }


在RestTemplate配置类方法上加@LoadBalanced

/**
 * 向容器提供HTTP客户端
 * @return
 */
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

对product-service项目重复上输操作

最后在调用服务时修改ip与端口为注册名

即localhost:8081改为product-service

@Override
public SysOrder getOrderById(Long id) {
    SysOrder sysOrder = orderMapper.selectById(id);
    SysProduct result = restTemplate.getForObject(
            "http://product-service/productservice/sysProduct/product/" + sysOrder.getProductId(),
            SysProduct.class);
    sysOrder.setProduct(result);
    return sysOrder;
}

启动两个客户端

再次访问127.0.0.1:8888

 注册成功

再查询订单

调用成功,表示成功从注册中心获得ip与端口

四、Eureka高可用 

        注册中心如果出现问题就会导致服务全部不可用,可以配置多台Eureka服务器形成集群,提高注册中心的可用性。 

application-one.properties

spring.application.name=eureka-one
server.port=8888
# 注册中心的地址
eureka.instance.hostname=127.0.0.1
# 是否拉取服务清单
eureka.client.fetch-registry=true
# 是否注册到eureka
eureka.client.register-with-eureka=true
# 定义注册中的服务地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8889/eureka,http://127.0.0.1:8890/eureka

application-two.properties

spring.application.name=eureka-three
server.port=8890
# 注册中心的地址
eureka.instance.hostname=127.0.0.1
# 是否拉取服务清单
eureka.client.fetch-registry=true
# 是否注册到eureka
eureka.client.register-with-eureka=true
# 定义注册中的服务地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka,http://127.0.0.1:8889/eureka

application-two.properties

spring.application.name=eureka-two
server.port=8889
# 注册中心的地址
eureka.instance.hostname=127.0.0.1
# 是否拉取服务清单
eureka.client.fetch-registry=true
# 是否注册到eureka
eureka.client.register-with-eureka=true
# 定义注册中的服务地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka,http://127.0.0.1:8890/eureka

启动这三台服务器

可以访问三台服务器的面板查看注册情况

同时还需要修改客户端配置

# 注册中心地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8888/eureka,http://127.0.0.1:8889/eureka,http://127.0.0.1:8890/eureka

再次测试查询

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值