穿越Java - SpringCloud篇 第三章 负载均衡 - Ribbon | 第2节RestTemplate+NACOS+Ribbon 实现服务的注册与发现和负载均衡

开发环境

基于:IntelliJ IDEAMaven构建工具JDK1.8SpringBoot 2.3.4Spring4.3.28编写。

官人如需使用 IDEA 请阅读教程:IntelliJ IDEA
官人如需使用 Maven 请阅读教程:Maven 构建工具的下载与安装

更多干货

请参考:《穿越 Java 之 语法基础篇》 系列文章
请参考:《穿越 Java 之 Web基础篇 》系列文章
请参考:《穿越 Java 之 开发必备框架篇 》 系列文章
请阅读:《穿越 Java 之 SpringBoot》系列文章
请阅读:《穿越 Java 之 SpringCloud》 系列文章

需求

实现 user 服务 对 order 服务进行调用。使用RestTemplate+ NACOS+Ribbon 实现服务的注册与发现和负载均衡。

分析

  • 在springcloud 要考虑的是:user要想调用order 必须要知道 它的一个IP 端口 路径进行调用.

  • 但是存在一个问题就是 假如还有其他的模块 就会再维护一份url地址 ,干很多重复的工作。如下图:在这里插入图片描述

  • 所以在微服务的场景下我们要先去考虑服务的注册与发现,如下图:
    在这里插入图片描述

  • 接下来就是选择 NACOS 进行服务的注册,可参考NACOS服务注册

  • 然后选择Ribbon 提供的功能是:【服务发现+负载均衡】
    在这里插入图片描述

使用

User-service

目录结构

  • 在这里插入图片描述

pom.xml 依赖

  • 整合springcloud–>spring-cloud-dependencies
  • 整合spring cloud alibaba–>spring-cloud-alibaba-dependencies
  • 整合spring cloud netflix–>spring-cloud-netflix-dependencies
  • 整合ribbon --> spring-cloud-starter-netflix-ribbon
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.4.RELEASE</version>
		<relativePath/> 
	</parent>
	<groupId>com.example</groupId>
	<artifactId>user-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>user-service</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<!--为项目 整合ribbon-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>
		<!--为项目 整合nacos-client-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
	</dependencies>
<!--为项目整合spring cloud-->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Greenwich.SR3</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--为项目整合spring cloud alibaba-->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>0.9.0.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--为项目整合spring cloud netflix-->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-netflix-dependencies</artifactId>
				<version>2.1.3.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

application.yml配置文件


server:
  port: 8096
#告诉我们的项目 nacos的地址是什么,方便注册localhost:8848
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: order-service

编写HelloController 类

  • @Slf4j --> 日志的输出
  • RestTemplate -->可以访问远程Http服务
package com.example.userservice.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;

@RestController
@Slf4j
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "Hello Spring Cloud";
    }
    @Autowired
    private RestTemplate restTemplate;
    
 @GetMapping("/test2")
    public  String test2(){
        //Ribbon会根据order-service名称做服务发现和负载均衡-->url192.168.0.3:
        return this.restTemplate.getForObject("http://order-service/order/query",String.class);

    }
}

编写UserServiceApplication 启动类

  • 注册了一个Bean -->RestTemplate
package com.example.userservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class UserServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(UserServiceApplication.class, args);
	}
	@Bean
	@LoadBalanced//此注解相当于为restTemplate整合了Ribbon的功能
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}

Order-service

目录结构

  • 在这里插入图片描述

pom.xml 依赖

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.4.RELEASE</version>
		<relativePath/> 
	</parent>
	<groupId>com.example</groupId>
	<artifactId>user-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>user-service</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<!--为项目 整合nacos-client-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
	</dependencies>
<!--为项目整合spring cloud-->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Greenwich.SR3</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--为项目整合spring cloud alibaba-->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>0.9.0.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--为项目整合spring cloud netflix-->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-netflix-dependencies</artifactId>
				<version>2.1.3.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

application.yml配置文件

server:
  port: 8096
#告诉我们的项目 nacos的地址是什么,方便注册localhost:8848
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: order-service

编写HelloController 类

package com.example.orderservice.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(path = {"/order"},method = {RequestMethod.GET})
@Slf4j
public class DemoController {
    @GetMapping("/query")
    public String demo(){
        log.info("我被访问了!");
        return "已查询出数据";
    }
}

编写UserServiceApplication 启动类

package com.example.orderservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OrderServiceApplication {

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

测试

  • 首先开启通过不同端口三个order服务1个user服务,以我的为例开启了8094,95,96的order服务和一个8090的用户服务。
    在这里插入图片描述
  • 访问:http://192.168.148.1:8848/nacos/
  • 进入nacos界面可以看到注册进去的服务。
    在这里插入图片描述
  • 最后访问http://localhost:8090/test2测试调用
    在这里插入图片描述
  • 每个端口访问的次数不同
    在这里插入图片描述
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页