SpringCloud2.0 服务消费者 rest+ribbon 配置 (三)

springcloud服务到注册和发现已将讲解基本微服务搭建(参考:https://blog.csdn.net/u014399489/article/details/98479883)
在微服务架构中不同功能到模块业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。在微服务框架中Spring cloud提供两种方式发送请求,一种是ribbon+rest,另一种是feign客户端访问模式,本篇博文提供到是ribbon+rest方式提供请求讲解

一、 Spring Cloud Ribbon 简介

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,
可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,
它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服
务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工
具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。  我们将具体介绍如何使用Ribbon来
实现客户端的负载均衡,负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的
缓解和处理能力扩容的重要手段之一。我们通常所说的负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。硬件负载
均衡主要通过在服务器节点之间按照专门用于负载均衡的设备,比如F5等;而软件负载均衡则是通过在服务器上安装一些用于负载均衡功能
或模块等软件来完成请求分发工作,比如Nginx等。不论采用硬件负载均衡还是软件负载均衡,只要是服务端都能以类似下图的架构方式构建
起来

二:环境准备

目前项目使用到的版本为Spring Boot版本2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE
参考文章:https://blog.csdn.net/u014399489/article/details/98479883 

三、搭建项目

1)请求流程图

在这里插入图片描述
2)编写测试代码:项目测试是基于maven构建

eureka-parents 父模块到pom.xml代码:

<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.3.RELEASE</version>
	</parent>

	<groupId>com.zeronode</groupId>
	<artifactId>springcloud-2.0-eureka-parents</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<modules>
		<module>springcloud-2.0-eureka-server</module>
		<module>springcloud-2.0-eureka-provider</module>
		<module>springcloud-2.0-eureka-consumer</module>
	</modules>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
	</properties>

	<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>

	<dependencies>
		<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>

注册中心代码:

注册中心 项目名称:springcloud-2.0-eureka-server 模块,pom.xml 代码:

<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.zeronode</groupId>
		<artifactId>springcloud-2.0-eureka-parents</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>springcloud-2.0-eureka-server</artifactId>

	<dependencies>
		<!-- 添加服务治理依赖包,eureka-server 服务注册与发现 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
	</dependencies>
	<name>springcloud-2.0-eureka-server</name>
</project>

注册中心 项目名称:springcloud-2.0-eureka-server 模块 application.properties 代码:

# 服务端口号
server.port= 8080

# 定义service-id 名称
spring.application.name=eureka-server

# 是否将自己注册到eureka-register注册中心,默认是true
eureka.client.register-with-eureka=false

# 是否获取eureka-register注册中心信息,默认true
eureka.client.fetch-registry=false

# 设置eureka 实例名称,与配置文件的变量为主
 eureka.instance.hostname=192.168.2.120

# 设置服务注册中心地址,指向另一个注册中心
eureka.client.service-url.defaultZone=http://192.168.2.120:8080/eureka/

注册中心 项目名称:springcloud-2.0-eureka-server 模块启动类代码:

package com.zeronode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

//告诉springboot是EUREKA 注册中心启动方式
@EnableEurekaServer
@SpringBootApplication
public class AppServer {

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

服务提供者 项目名称:springcloud-2.0-eureka-provider 模块,pom.xml 代码:

<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.zeronode</groupId>
    <artifactId>springcloud-2.0-eureka-parents</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>springcloud-2.0-eureka-provider</artifactId>
  <name>springcloud-2.0-eureka-provider</name>
  
  <dependencies>
		<!-- 添加服务治理依赖包,eureka-server 服务注册与发现 -->
		<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-web</artifactId>
		</dependency>
	</dependencies>
</project>

服务提供者 项目名称:springcloud-2.0-eureka-provider 模块,application.properties 代码:

server.port=8090
spring.application.name=eureka-provider
# 指定注册中心到地址
eureka.client.service-url.defaultZone=http://192.168.2.120:8080/eureka

服务提供者 项目名称:springcloud-2.0-eureka-provider 模块,启动类 代码:

package com.zeronode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class AppProvider {

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

服务提供者 项目名称:springcloud-2.0-eureka-provider 模块,提供服务到代码 :

package com.zeronode.api.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/aip/user")
public class ApiUserController {

	@Value("${server.port}")
	private String serverPort;

	@GetMapping("/getUserInfo")
	public String getUserInfo() {
		return "提供服务的服务器器端口号:" + serverPort;
	}
}

服务消费者 项目名称:springcloud-2.0-eureka-consumer 模块,pom.xml代码 :

<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.zeronode</groupId>
    <artifactId>springcloud-2.0-eureka-parents</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  
  <artifactId>springcloud-2.0-eureka-consumer</artifactId>
  
  <dependencies>
		<!-- 添加服务治理依赖包,eureka-server 服务注册与发现 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<!-- 添加ribbon 负载均衡组件依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
</project>

服务消费者 项目名称:springcloud-2.0-eureka-consumer 模块,application.properties 代码 :

server.port=9001
spring.application.name=eureka-consumer
#  订阅注册中心中服务接口信息地址 
eureka.client.service-url.defaultZone=http://192.168.2.120:8080/eureka/

服务消费者 项目名称:springcloud-2.0-eureka-consumer 模块,启动类代码 :

package com.zeronode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

//@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class AppConsumer {

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

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

服务消费者 项目名称:springcloud-2.0-eureka-consumer 模块,调用服务代码代码 :
package com.zeronode.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/user")
public class UserController {

@Autowired
private RestTemplate restTemplate;

/**
 * 这种方式是rpc远程调用,经过注册中心调用
 * 需要注意,在rest调用需要在注入restTemplate 时候添加 @LoadBalanced 注解
 * @return
 */
@GetMapping("/getUserInfo1")
public String getUserInfo1(){
	String str = restTemplate.getForObject("http://EUREKA-PROVIDER/aip/user/getUserInfo", String.class);
	return str;
}

}

以上是测试代码,

2) 测试流程说明:

1:运行 springcloud-2.0-eureka-server 启动类,启动完成访问本地:http://localhos:8080 可以看到图像界面到注册中心。
2:运行 springcloud-2.0-eureka-provider 启动类,通过注册中心可以看到服务提供者已经注册到注册中心,为了看到负载均衡到效果,我们需要 springcloud-2.0-eureka-provider 配置文件修改端口号为 8091 ,启动两台服务提供者服务
3:运行 springcloud-2.0-eureka-consumer启动类 ,在注册中心可以看到服务消费者信息,这时候浏览器地址访问http://localhost:8091/aip/user/getUserInfo ,刷新几次,可以看到返回信息中,服务提供者到端口8090 和8091 轮流切换提供服务,说明当前项目到负载均衡已经生效

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值