有小伙伴不太了解微服务的请看小编
微服务以及的spring cloud核心组件
这两篇文章。
该文章讲述服务的两种调用方式
1.restTemplate+Ribbon
ribbon:基于Netflix Ribbon 用过轮询策略实现的一套客户端负载均衡的工具
客户端负载均衡:负载均衡Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一一个服务实例。spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法(如简单轮询,随机连接等)选择一个服务器,然后进行访问。
RestTemplate:传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
2.eureka集群的搭建

接下来我们先搭建基于Ribbon的客户端,用于消费服务。
同理先搭建spring cloud基本环境可参考小编上一篇文章IntelliJ idea搭建微服务spring cloud框架(一)

1、搭建restTemplate+Ribbon服务消费端

与之前搭建eureka-client微服务不同的是
(1)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>common</artifactId>
        <groupId>com.wander</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../common/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>restTemplate-ribbon</artifactId>

    <name>restTemplate-ribbon</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>
        <!--引入springcloud的euekea server依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
    </dependencies>

</project>

(2)application.yml文件内容

server:
  port: 8702 # 服务消费方

# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost

#当前服务名称
spring:
  application:
    name: restTemplate-ribbon

服务的消费方依旧需要在注册方8700端口去注册。配置当前服务消费方的端口8072,名字为restTemplate-ribbon
目前一共三个微服务和一个公共模块
在这里插入图片描述
(3)将eurekaserver,eurekaclient,restTemplate-ribbon三个为微服务依次运行起来,就是将他们各自的启动类运行起来。
用浏览器打开注册中心,会看到eurekaclient,restTemplate-ribbon这两个微服务已经注册到注册中心
在这里插入图片描述
(4)在restTemplate-ribbon这个微服务中编写配置类
RestTemplateConfig.java
在这里插入图片描述

package com.wander.config;

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author WDYin
 * @Date 2019/10/22
 * @Description
 * 然后如controller中一样注入一下restTemplate,并且使用他,
 * 区别是可以直接使用服务名访问了
 *
 * String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
 */

@Configuration
public class RestTemplateConfig {

    @LoadBalanced   //LoadBalanced表示需要做负载匀衡。
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        // Do any additional configuration here
        return builder.build();
    }

}


(5)创建HelloRestTemplateRibbon.java类

package com.wander.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

/**
 * @Author : WDYin
 * @Date : 2020/3/13
 * @Description :
 */
@Controller
@RequestMapping("restTemplate")
public class HelloRestTemplateRibbon {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("ribbon")
    @ResponseBody
    public String ribbon(String s){
        System.out.println("传入的值为:"+s);
        //第一种调用方式
//        String result = new RestTemplate().getForObject("http://localhost:8701/springcloud/eurekaClient?s=" + s, String.class);

        //第二种调用方式
        //根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
        //ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client");
        //String result = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/springcloud/eurekaClient?s="+s,String.class);

        //第三种调用方式 需要restTemplate注入的方式
        String result = restTemplate.getForObject("http://eureka-client/springcloud/eurekaClient?s=" + s, String.class);
        return result;
    }
}

(6)将eurekaserver,eurekaclient,restTemplate-ribbon三个为微服务依次运行起来,就是将他们各自的启动类运行起来。
(7)浏览器访问:http://localhost:8702/restTemplate/ribbon?s=1
在这里插入图片描述
在这里插入图片描述
页面显示的结果一致证明,restTemplate这个微服务通过restTemplate+ribbon消费了eureka-client这个微服务的产品。

2、 Eureka server的高可用配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三个eureka微服务的端口分别对应
01:8699
02:8698
03:8699
在这里插入图片描述
接下来分别改注册端口号,defaultZone分别启动三个启动项
配置另外两个端口号

在这里插入图片描述

#server:
#  port: 8700 # 端口自己决定

# 指定当前eureka客户端的注册地址,也就是eureka服务的提供方,当前配置的服务的注册服务方
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8699/eureka,http://localhost:8698/eureka
    register-with-eureka: false #自身 不在向eureka注册
    fetch-registry: false  #启动时禁用client的注册
#  instance:
#    hostname: localhost

#指定应用名称
spring:
  application:
    name: eureka-server

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后浏览器访问
http://localhost:8699/
http://localhost:8698/
http://localhost:8697/
这三个都可以访问了
然后把服务提供方中的eureka端口改为刚刚设置的eureka集群对应的三个端口中的其中一个,然后运行该微服务
在这里插入图片描述
启动服务提供方之后,再次访问三个01,02,03我们会发现
重点:即使服务提供方只注册了一个端口号8699,但是另外两个端口号,也能感知到服务提供方8701的存在了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码地址在码云:https://gitee.com/wdyin/micro_service.git

到此,spring cloud的公共模块、eureka-server集群、eureka-client、restTemplate、feign等模块搭建完毕,稍后会搭建、restTemplate-ribbon、feign+ribbon负载均衡、config+bus实现配置中心自动刷新、hystrix+dashboard断路器监控等模块。
有小伙伴不太了解微服务的请看小编微服务以及的spring cloud核心组件这两篇文章。该文章主要介绍搭建微服务框架

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐