博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA springboot微服务b2b2c电子商务系统(二)服务消费者(rest+ribbon)
阅读量:7043 次
发布时间:2019-06-28

本文共 4951 字,大约阅读时间需要 16 分钟。

一、ribbon简介

Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using @FeignClient then this section also applies.

—–摘自官网

ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。

ribbon 已经默认实现了这些配置bean:

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl

  • IRule ribbonRule: ZoneAvoidanceRule

  • IPing ribbonPing: NoOpPing

  • ServerList ribbonServerList: ConfigurationBasedServerList

  • ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter

  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

二、准备工作

这一篇文章基于上一篇文章的工程,启动eureka-server 工程;启动service-hi工程,它的端口为8762;将service-hi的配置文件的端口改为8763,并启动,这时你会发现:service-hi在eureka-server注册了2个实例,这就相当于一个小的集群。访问localhost:8761如图所示:

三、建一个服务消费者

重新新建一个spring-boot工程,取名为:service-ribbon;

在它的pom.xml文件分别引入起步依赖spring-cloud-starter-eureka、spring-cloud-starter-ribbon、spring-boot-starter-web,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?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>
<groupId>com.forezp</groupId>
<artifactId>service-ribbon</artifactId>
<version>
0.0
.
1
-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-ribbon</name>
<description>Demo project
for
Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>
1.5
.
2
.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-
8
</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-
8
</project.reporting.outputEncoding>
<java.version>
1.8
</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https:
//repo.spring.io/milestone</url>
<snapshots>
<enabled>
false
</enabled>
</snapshots>
</repository>
</repositories>
</project>

  在工程的配置文件指定服务的注册中心地址为,程序名称为 service-ribbon,程序端口为8764。配置文件application.yml如下:

1
2
3
4
5
6
7
8
9
eureka:
client:
serviceUrl:
defaultZone: http:
//localhost:8761/eureka/
server:
port:
8764
spring:
application:
name: service-ribbon

  在工程的启动类中,通过@EnableDiscoveryClient向服务中心注册;并且向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootApplication
@EnableDiscoveryClient
public
class
ServiceRibbonApplication {
public
static
void
main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.
class
, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return
new
RestTemplate();
}
}

  写一个测试类HelloService,通过之前注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,代码如下:

1
2
3
4
5
6
7
8
9
10
11
@Service
public
class
HelloService {
@Autowired
RestTemplate restTemplate;
public
String hiService(String name) {
return
restTemplate.getForObject(
"http://SERVICE-HI/hi?name="
+name,String.
class
);
}
}

  写一个controller,在controller中用调用HelloService 的方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Created by fangzhipeng on 2017/4/6.
*/
@RestController
public
class
HelloControler {
@Autowired
HelloService helloService;
@RequestMapping
(value =
"/hi"
)
public
String hi(
@RequestParam
String name){
return
helloService.hiService(name);
}
}

  

在浏览器上多次访问,浏览器交替显示:

hi forezp,i am from port:8762

hi forezp,i am from port:8763

这说明当我们通过调用restTemplate.getForObject(““+name,String.class)方法时,已经做了负载均衡,访问了不同的端口的服务实例。

架构代码如下:

需要JAVASpring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求:一零三八七七四六二六

转载于:https://juejin.im/post/5ca46f0f6fb9a05e437b8a70

你可能感兴趣的文章
学习OpenCV——绘制彩色直方图(HSV2BGR)
查看>>
Processing中图片色彩设置
查看>>
Cocos2d 中对图片的各种操作
查看>>
cocos2d坐标系
查看>>
Android.mk的用法和基础
查看>>
CentOS7 安装Docker
查看>>
笔记本高分辨软件兼容问题,字体太小或模糊
查看>>
分布式存储系统可靠性系列五:副本放置算法 & CopySet Replication
查看>>
常用电线负载的电流和功率
查看>>
TreeMap升序|降序排列和按照value进行排序
查看>>
redis在windows10上跑起来
查看>>
面试题目:反转链表的算法实现
查看>>
xss挖掘初上手
查看>>
SGU 116 Index of super-prime
查看>>
简化Web开发的12个HTML5-CSS框架
查看>>
C#温故而知新学习系列之.NET运行机制—.NET中非托管代码是指什么?(二)
查看>>
25个漂亮的国外绿色网站设计作品分享
查看>>
C++中delete与delete[]
查看>>
iphone:URL initWithString 返回为空
查看>>
ASP.NET页面间数据传递的9种方法
查看>>