SpringCloud框架从零开始纯干货分享(二)Eureka服务提供及服务消费

SpringCloud框架从零开始纯干货分享(二)Eureka服务提供及服务消费

前言:

首先如果你已经阅读了SpringCloud框架从零开始纯干货分享(一)Eureka注册中心搭建这篇文章那你应该已经成功搭建起来了一个注册中心,接下来的阅读对于你将更加顺畅~如果没有读过想去看看的话可以从上方链接直接点过去的。接下来我们开始讲本节课我们要讲的东西了。

本节内容梳理:

架构图

cloud架构图

为了防止大家忘记上一节的架构图我们这一节继续放在这方便后续理解

本章内容:

上面的图我们看到了我们现在完成了第一点内容也就是注册中心(房屋中介),这时候我们最近的还缺少什么?客户对吧也就是我们的服务提供者(房东)和服务消费者(租客)那这一节我们先来完成服务提供者(房东)和服务消费者(租客)至于服务提供者与配置中心集群部分我们后续来进行完善包括后续的熔断器和服务内的负载均衡,这一章我们先来完成最基本的功能。

服务提供者:

首先我们要知道服务提供者是做什么的?从名字来看就是给消费者这边提供服务那我们以什么方式去提供服务?抱着以下疑问我们进行搭建,搭建完成后我们就可以有一个基本概念了直接开始吧
新建服务提供者
首先我们新建一个项目如果你们想在一个module下进行整套的管理也是可以的~我这边并没有放在一个module下这个各位自己斟酌就行。我这边因为只是一个demo所以命名为SrpingEurekaProvider方便各位理解这是一个服务提供者。接下来我们选择一些默认的配置
如下图
新建服务提供者第二步

敲黑板~这边我们使用的Boot版本跟服务注册中心的版本一致方便管理!建议维护为统一版本哦
我们来讲一下我加的这三个模块:
SpringBoot Actuator:这个模块呢主要作用是用于Eureka-Server端的健康检查
Eureka Discovery Client:模块从图上我们就可以看到Eureka只有一个Server一个Client可以知道既然Server用作注册中心了那我们的服务提供者又要注册到Server那边自然是以Client身份去lo。
Spring Web:各位很熟悉了就是SpringMVC等
好了模块我们也了解完了。

那我们就点击Finish吧~
新建Provider第三步
如上我们的项目结构就是辣个样子,然后我新建了一个application.yml并且关键的两处我已经用注释写好了~如果你不了解Spring Eureka的配置文件我会再写一章关于Eueka的配置文件的详解,如果你看过第一章那这一章的配置文件你基本上可以了解清楚的。下面我贴一下具体的配置文件内容

spring:
  application:
    name: Provider
eureka:
  instance:
    prefer-ip-address: true
    health-check-url-path: /actuator/health
  client:
    register-with-eureka: true
    #生产端不需要拉取服务
    fetch-registry: false
    service-url:
      #注册中心地址
      defaultZone: http://localhost:3355/eureka
server:
  port: 8080

继续敲黑板~这里注意下如果你第一章的defaultZone也就是注册中心地址不是3355那你就改为自己的就好其余的参数大部分我们在第一章已经讲过了

现在是不是感觉没什么东西了?小了~格局小了呀!他是一个服务提供者服务呢?自然要现在写了如下

新建服务提供者第四步
如上图我们可以看到我简单的写了一下我们入门的一个Hello World虽然简单但是实用啊~真正的服务提供者肯定会有各个层比如持久化层、服务层、业务层等等等各位自己拓展吧。
到这里许多人就明白了实际上他就是写了一个接口呗啥玩意啊搞这么神秘!辣鸡。接下来我们跑一下看看

黑板敲碎!这边注意下既然是要做一个分布式架构我们也写好了一个注册中心那我们就得用起来啊把注册中心跑起来~然后跑一下我们的提供者!

新建服务提供者第五步
到这基本上就能看出来了,我第一章定义的我的注册中心叫pig然后你会发现下面新增了一个PROVIDER的而我的配置中心的名字刚好明明为Provider从Status栏可以看到我命名及端口等信息那我们的服务提供者先到这里。如果各位用于实际工作服务提供者应该是单应用多节点多配置中心具体怎么配置多配置中心实际上就是在配置文件中的defaultZone中做出具体修改

服务消费者:

上面呢我们也写完了一个服务的提供前一章我们也写好了一个服务的注册中心,接下来我们写一下服务的消费者。
新建服务消费者第一步
简简单单创建一个新的项目我的呢依旧是随意的命名为了SpringEurekaCustomer方便各位理解,各位自行拓展好吧~
新建服务消费者第二步

这里我们还是日常的讲一下我们的模块~但是因为里面有三个我们之前已经说过了我们就仅仅讲一下我们新加的这个
Cloud LoadBalancer:首先名称解析从字面翻译来看是Cloud的加载平衡器,实际平衡器作用干嘛?负载均衡咯当然了这就是用于服务发现负载均衡

接下来finish我们进入项目去编写具体代码
新建服务消费者第三步
这里我们可以看到基本的项目结构以及我的老习惯新建的application.yml不过这次的yml我也是稍微注释了一下,可以看到基本的信息下面老样子我来贴一下具体的代码

spring:
  application:
    name: Customer
eureka:
  instance:
    prefer-ip-address: true
    health-check-url-path: /actuator/health
  client:
    register-with-eureka: true
    #消费端需要发现服务
    fetch-registry: true
    service-url:
      #注册中心地址
      defaultZone: http://localhost:3355/eureka
server:
  port: 8081

配置文件如上~他跟服务提供者关键的一个点在于消费者需要发现服务但是服务提供者不需要发现服务同样的因为是demo就写的稍微简单了点,具体应用需要做一定拓展,单应用多节点的部署分别注册到注册中心集群内拉取集群内的服务。
接下来别急着跑我们还需要继续写东西呢~首先找到你的主程序文件如下图加上@EnableDiscoveryClient注解
新建服务消费者第四步

注意下哦@EnableDiscoveryClient别忘了千万别忘了千万哦~
因为这个注解是告诉Eureka需要发现服务的

这时候或许新的疑问来了,我们标识完了怎么使用服务提供者的服务,怎么给网关具体的返回?看下图我们继续进行
新建消费者第五步
这边我又双叒叕建了一个Controller只不过大家可以看到我们这个Controller跟之前的很不一样~具体哪里呢?我们来讲一下
首先我们注入(@Autowired)了一个RestTemplate这个玩意是个什么东西?字面意思Rest模版简单再理解一下就是请求Restful接口的模版呗对不对各位大佬?

但是这东西你如果仅仅注入没有下面的@Bean标注的那个方法就会获得如下提示


Could not autowire. No beans of 'RestTemplate' type found. 

哎这时候是不是就明白了就是没有Bean所以不能注入咩。
那我们就简简单单给他搞一下新建个public方法返回就是Rest Template我们用常用的new一下就有了呗那为啥要加@Bean注解呢?那不就是@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。(和xml配置中的bean标签的作用是一样的)
这不就简简单单搞定了么?
这时候就有大佬看到了@LoadBalanced这个注解~但是同样的大佬也看到了注解方法的注释,所以暂时就有了一个概念,我们这章就不深入讲解了。
继续贴代码~如下

package com.example.springeurekacustomer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author 测试服务提供者的hello服务
 */
@RestController
public class TestHelloController {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * LoadBalanced 注解会在RestTemplate中添加一个Interceptor,用于解析url地址,获取服务名,然后调注册中心的服务列表接口进行负载均衡
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    /**
     * 这边为了方便区分我们使用a为拦截地址进行测试方便区别hello拦截地址
     * 这边传入的url为我们服务提供者的名称
     */
    @RequestMapping("/a")
    @ResponseBody
    public String testHello(){
        return restTemplate.getForObject("http://Provider/hello", String.class);
    }
}

是不是很清晰~是不是根本不需要讲了?说白了就是写了个方法然后通过Rest Template去调用了我Provider下的hello但是这个代码有个BUG心细的一定知道就是我明明用的@RestController为啥还要用@ResponseBody这个注解?简单来讲就是我太懒了~我不想去改了然后重新截图。所以这边就讲一下就好了。
接下来我们运行项目然后刷新我们的localhost:3355就是我们注册中心的页面如下图
三家齐活

这里我们看到pig(注册中心)、Provider(服务提供者)、Customer(服务消费者)都有了那我们测试下我们/a链接访问效果?
我掐指一算各位的访问结果如下图吧
访问失败

是不是被我说中了?哈哈哈哈哈请喊我半仙~

实际上根本原因是下面这

    #当eureka服务器在短时间内丢失过多客户端时,自我保护可使服务端不再删除失去链接的客户端
    enable-self-preservation: false

我在第一章时候贴过配置文件的,实际是eureka的自我保护上一章我设置的是true,因为现在我们是demo状态这个都是做的单节点所以先设置为false后续生产各位按照自己情况进行设置。

接下来我们修改后刷新一下刚刚的/a如下图
在这里插入图片描述

ok啦~恭喜各位大佬成功完成注册中心服务提供服务消费~

到这里停一下嗷,思考一个问题我们每次写个Controller难道每个Controller都要写一次RestTemplate的实例化么?有没有简单方便的方法?

实际上的确是有的我们使用了@Bean注解已经交由Spring进行管理了,而且RestTemplate这个东西是不是仅仅是一个模板相对于Service层的一些实现是否有区别?
那我们是不是可以将下面这段放入SpringEurekaCustomerApplication启动文件内?
答案很明显是可以的各位可以尝试一下~

    /**
     * LoadBalanced 注解会在RestTemplate中添加一个Interceptor,用于解析url地址,获取服务名,然后调注册中心的服务列表接口进行负载均衡
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

这一章到这里差不多结束了,各位相比理解快的心中有很多疑问~没事我们后续还有继续解答,我答应各位的SpringEurkea的配置文件具体的内容我会在后续开一篇博客单独讲一下,因为Eureka的配置实际还比较多。

这一章的内容到这里就结束了,希望各位如果感觉有用的话可以收藏关注一下,如果有疑问也可以在下方直接评论我会继续更新回复。一次讲的太多不如每次适量希望各位好好理解一下这部分的东西方便应对后续的章节。再见~
注册中心及服务消费服务生产源代码下载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值