IntelliJ idea搭建微服务spring cloud框架(二)
idea+maven搭建restTemplate+ribbon和eureka集群
有小伙伴不太了解微服务的请看小编
微服务以及的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核心组件这两篇文章。该文章主要介绍搭建微服务框架
更多推荐
所有评论(0)