spring cloud备忘笔记-3-创建服务消费者(Ribbon)

spring cloud备忘笔记-3-创建服务消费者(Ribbon)


笔记索引:
spring cloud备忘笔记-0-目录索引

介绍

  Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,Feign也是基于Ribbon实现的工具。

这里我们使用Ribbon+RestTemplate 完成创建消费者。

开工

  和之前一样创建一个hi-spring-cloud-web-admin-ribbon目录,这个是客户端的admin。
项目架构所需依赖

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

完整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">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.momomian</groupId>
        <artifactId>hi-spring-cloud-dependencies</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../hi-spring-cloud-dependencies/pom.xml</relativePath>
    </parent>

    <artifactId>hi-spring-cloud-web-admin-ribbon</artifactId>
    <packaging>jar</packaging>

    <name>hi-spring-cloud-web-admin-ribbon</name>
    <inceptionYear>2019-Now</inceptionYear>

    <dependencies>
        <!-- Spring Boot Begin -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Boot End -->

        <!-- Spring Cloud Begin -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <!-- Spring Cloud End -->

        <!-- 解决 thymeleaf 模板引擎一定要执行严格的 html5 格式校验问题 -->
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.momomian.hi.spring.cloud.web.admin.ribbon.WebAdminRibbonApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

WebAdminRibbonApplication .java
这边使用的注解是@EnableDiscoveryClient 看名字就知道是要去发现服务的提供者

package com.momomian.hi.spring.cloud.web.admin.ribbon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
 * @author 
 * @date 2019/10/11
 * @description
 */
@SpringBootApplication
@EnableDiscoveryClient
public class WebAdminRibbonApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebAdminRibbonApplication.class,args);
    }
}

application.yml这边不用thymeleaf模板的可以不配置

spring:
  application:
    name: hi-spring-cloud-web-admin-ribbon
  thymeleaf:
    cache: false
    mode: LEGACYHTML5
    encoding: UTF-8
    servlet:
      content-type: text/html

server:
  port: 8782

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8780/eureka/

  配置注入 RestTemplate 的 Bean,并通过@LoadBalanced注解表明开启负载均衡功能
创建一个包config
RestTemplateConfiguration.java

package com.momomian.hi.spring.cloud.web.admin.ribbon.config;

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 
 * @date 2019/10/11
 * @description
 */

@Configuration
public class RestTemplateConfiguration {

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

  这里是spring的知识,@Configuration注解等同于我们创建了一个springcontext.xml,通过@Bean将RestTemplate交给spring管理。因为这个RestTemplate是别人写好的代码,我们没办法在这个类中加注解交给spring管理,所以spring他提供这种Bean的方式来做。也可以用xml配置方式,这里我们采用java配置的方式取代了xml。

负载均衡

  然后我们这边注解了开启负载均衡功能,那我们要启动两台service admin,我们之前配置的端口是8781,先Dashboard启动它,
  现在点击运行编辑配置,找到我们ServiceAdminApplication,打开看到一个勾选项如下:
在这里插入图片描述  把这个勾去掉,应用,然后我们把service admin之前的yml中port改成8784,再启动一次即可开启两个服务了。
在这里插入图片描述
  回到尤里卡刷新一下,可以看到有两个服务了。可以分别测试一下接口。
  那么我们的服务消费者访问的时候就可以去访问两台服务8781和8784,压力就减轻了。我们的  @LoadBalanced注解后就会自己去找服务的提供者。

测试

  现在我们在ribbon消费者写一个service去访问提供者。
  在ribbon包下创建一个service包,
AdminService.java

package com.momomian.hi.spring.cloud.web.admin.ribbon.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @author 
 * @date 2019/10/11
 * @description
 */
@Service
public class AdminService {
	//由于我们已经把RestTemplate 交给spring管理了,这边就可以直接拿了
    @Autowired
    private RestTemplate restTemplate;
	//我们现在要去找服务提供者的 hi接口
    public String sayHi(String message) {
        return restTemplate.getForObject("http://HI-SPRING-CLOUD-SERVICE-ADMIN/hi?message=" + message, String.class);
    }
}

  这里通过restTemplate对象告知访问的是哪个服务提供者(根据服务提供者yml配置的application.name来找),然后调用接口即可,ip和端口都由尤里卡托管。
我们再写controller层
AdminController.java

package com.momomian.hi.spring.cloud.web.admin.ribbon.controller;

import com.momomian.hi.spring.cloud.web.admin.ribbon.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class AdminController {
    @Autowired
    private AdminService service;
    @RequestMapping(value = "hi",method = RequestMethod.GET)
    public String sayHi(String message){
        return service.sayHi(message);
    }
}

  clean 一下。analyze一下,运行一下,佛祖保佑,天下太平。
在这里插入图片描述  用8782去浏览器http://localhost:8782/hi?message=hi
  访问多次就会看到下面两种情况,这样我们负载均衡就实现了。离高可用进了一步了。

[Hi! welcome spring cloud] your message is:hi port:8784
[Hi! welcome spring cloud] your message is:hi port:8781

  这边只是简单实现一下,我们已经可以拿到服务提供者提供的服务了,然后实现自己要实现的业务逻辑即可。

狂笑

哈哈哈哈哈哈哈哈哈哈哈哈哈
开心一下,继续学习。
接下来我们看看feign的方式实现消费。

笔记索引:
spring cloud备忘笔记-0-目录索引

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值