笔记索引:
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-目录索引