springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
创建5个项目:
1.服务注册中心
2.服务提供者1
3.服务提供者2(与服务提供者1的代码实现一样,这是是为了模拟负载均衡)
4.ribbon客户端项目
5.feign客户端项目
如图:

一、注册中心项目:
pom文件中添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
启动类:
/**
* MainApp类描述: 服务注册中心
*
* @author yangzhenlong
* @since 2017/3/16
*/
@EnableEurekaServer//注解启动一个服务注册中心
@SpringBootApplication
public class RegisterMainApp { public static void main(String[] args) {
SpringApplication.run(RegisterMainApp.class, args);
}
}
application配置文件:
server.port=8888 #在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false #服务注册地址
eureka.instance.ip-address=localhost
eureka.instance.prefer-ip-address=true
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
然后启动项目,访问:http://localhost:8888/

这时候发现,Application下面是空的,因为还没有服务注册进来
2.服务提供1
pom文件:

启动类:
/**
* MainApp类描述: 服务提供
*
* @author yangzhenlong
* @since 2017/3/16
*/
@EnableDiscoveryClient//激活Eureka中的DiscoveryClient实现
@SpringBootApplication
public class ProviderMainApp { public static void main(String[] args) {
SpringApplication.run(ProviderMainApp.class, args);
}
}
提供的rest接口类:
package com.eureka.rest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; /**
* UserController类描述:
*
* @author yangzhenlong
* @since 2017/4/13
*/
@RestController()
public class UserController { private final static Logger LOGGER = LoggerFactory.getLogger(UserController.class);
@Autowired
private DiscoveryClient discoveryClient; @RequestMapping("/")
public String index(){
return "index";
} @RequestMapping("/client")
public String client(){
String description = discoveryClient.description();
ServiceInstance localServiceInstance = discoveryClient.getLocalServiceInstance();
List<String> services = discoveryClient.getServices();
StringBuffer sb = new StringBuffer();
sb.append("discoveryClient描述:" + description);
sb.append("\ndiscoveryClient本地服务HOST:" + localServiceInstance.getHost() + "---port:" + localServiceInstance.getPort() + "---serverId:" +localServiceInstance.getServiceId());
sb.append("\ndiscoveryClient services:" + services);
return "discoveryClient:" + sb.toString();
} @RequestMapping("/{id}")
public String get(@PathVariable String id){
logCurrServerInfo();
return discoveryClient.getLocalServiceInstance().getHost()
+ discoveryClient.getLocalServiceInstance().getPort()
+ "<hr/>用户:" + id;
} @RequestMapping("/add/{name}")
public String add(@PathVariable String name){
logCurrServerInfo();
return discoveryClient.getLocalServiceInstance().getHost()
+ discoveryClient.getLocalServiceInstance().getPort()
+ "<hr/>添加用户:" + name;
} @RequestMapping("/getAll")
public String add(){
logCurrServerInfo();
String s = "";
for(int i=1; i<=5; i++){
s = s + i + "测试测试" + System.currentTimeMillis() + "\n";
}
return discoveryClient.getLocalServiceInstance().getHost()
+ discoveryClient.getLocalServiceInstance().getPort()
+ "<hr/>所有用户:" + s;
}
private void logCurrServerInfo(){
LOGGER.info("当前服务信息------\n ServiceId:{}, \n Host:{},\n Port:{}",
discoveryClient.getLocalServiceInstance().getServiceId(),
discoveryClient.getLocalServiceInstance().getHost(),
discoveryClient.getLocalServiceInstance().getPort()
);
} }
application配置:
server.port=1111
server.address=localhost
spring.application.name=provider #注册中心地址
eureka.instance.ip-address=localhost
eureka.instance.prefer-ip-address=true
eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka/
然后启动该项目,这时候看见注册中心console打印信息:有服务为provider端口为1111的服务注册进来了

再刷新http://localhost:8888/注册中心页面,发现application中有注册进来一个服务,名称为PROVIDER

这样第一个服务就注册完成了
3.服务提供者2(这里为了模仿负载均衡,provider1项目的代码拷贝一份,修改端口为2222),和第二步类似,只是配置文件中,设置端口为:2222

启动服务,查看注册服务console:

刷新注册中心地址,发现2个服务注册到同一个服务名称,只是端口不一样

4.ribbon http客户端
pom文件中加入eureka和ribbon:
<!--父依赖包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/>
</parent> <!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
注:这里的springboot版本要设置为1.3.x,如果设置1.4.x,启动项目的时候,会报错:
springboot版本选择1.4.x时会报错:
org.springframework.core.annotation.AnnotationConfigurationException: Attribute 'value' in annotation [org.springframework.cloud.netflix.feign.FeignClient] must be declared as an @AliasFor [serviceId], not [name]. 启动类:
@EnableDiscoveryClient//发现服务
@SpringBootApplication
public class ClientRibbonMainApp { @Bean
@LoadBalanced//开启均衡负载能力
public RestTemplate restTemplate(){
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(ClientRibbonMainApp.class, args);
}
}
http客户端调用:
@RestController()
public class RibbonController { private final static Logger LOGGER = LoggerFactory.getLogger(RibbonController.class);
@Autowired
private RestTemplate restTemplate; @RequestMapping("/")
public String index(){
return "index";
} @RequestMapping("/add/{name}")
public String add(@PathVariable String name){
ResponseEntity<String> forEntity = restTemplate.getForEntity("http://PROVIDER/add/" + name, String.class);
return forEntity.getBody();
}
}
启动ClientRibbonMainApp类后,注册服务:


这时候去访问ribbon项目:http://localhost:1234/add/12djsf

再去查看2台服务提供者项目的控制台console:


发现Provider2被调用了,到浏览器多次请求http://localhost:1234/add/12djsf,发现有时候会调用服务1,有时候会调用服务2,所以这里我们的负载均衡起作用了。




ribbon客户端就完成了。。
5.feigh http客户端
首先pom中添加eureka和feign的依赖:
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
启动类:
@EnableDiscoveryClient//发现服务
@EnableFeignClients//开启Feign功能
@SpringBootApplication
public class ClientFeignMainApp { public static void main(String[] args) {
SpringApplication.run(ClientFeignMainApp.class, args);
}
}
注册服务端的类,这里使用接口注解的方式,实现rpc调用:
@FeignClient("provider")//注册中心注册的服务名称,也就是serviceId
public interface ProviderFeignClient {
@RequestMapping("/add/{name}")
String add(@RequestParam(value = "name") String name);
@RequestMapping("/getAll")
String getAll();
}
调用服务:把服务接口注入进来,直接使用接口中的方法实现rpc
@RestController
public class FeignController { private final static Logger LOGGER = LoggerFactory.getLogger(FeignController.class);
@Autowired
private ProviderFeignClient providerFeignClient;
@RequestMapping("/feign")
public String index(){
String all = providerFeignClient.getAll();
return "------" + all;
} }
启动ClientFeignMainApp类


浏览器访问:http://localhost:1233/feign


发现有时候调用服务1,有时候调用服务2,这里用feign也能实现http负载均衡。
代码地址:https://github.com/yangzhenlong/mySpringBootDemo
springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用的更多相关文章
- 将SpringCloud Eureka 服务注册与发现部署到docker
一.前言 最近在学习docker,顺便把之前学习的spring cloud 部署到Docker 中.至于什么是SpringCloud的服务注册与发现,什么是docker,我这里就不作赘述了.可以先去学 ...
- SpringCloud Eureka服务注册及发现——服务端/客户端/消费者搭建
Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分为 Eureka Serv ...
- SpringCloud——Eureka服务注册和发现
一.SpringCloud和Dubbo SpringCloud整合了一套较为完整的微服务解决方案框架,而Dubbo只是解决了微服务的几个方面的问题. content Dubbo SpringCloud ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
- SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门
1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...
- SpringCloud(3)---Eureka服务注册与发现
Eureka服务注册与发现 一.Eureka概述 1.Eureka特点 (1) Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. (2) Eureka 主管服务 ...
- SpringCloud 进阶之Eureka(服务注册和发现)
1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册 ...
- Spring Cloud学习(一):Eureka服务注册与发现
1.Eureka是什么 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的. Eureka ...
- Eureka服务注册与发现
一.服务注册 注册Eureka的服务非常的简单,只需要引入spring-cloud-starter-netflix-eureka-client的jar包即可. <dependency> & ...
- Spring Cloud之Eureka服务注册与发现
解决什么问题 ➟阐述微服务以及服务注册发现的部分概念 ➟阐述Eureka服务注册与发现的部分原理及细节 为什么需要服务中心 过去,每个应用都是一个CPU,一个主机上的单一系统.然而今天,随着大数据和云 ...
随机推荐
- CodeForces - 589A(二分+贪心)
题目链接:http://codeforces.com/problemset/problem/589/F 题目大意:一位美食家进入宴会厅,厨师为客人提供了n道菜.美食家知道时间表:每个菜肴都将供应. 对 ...
- CodeForces - 589A(字符串处理)
题目链接:http://codeforces.com/problemset/problem/589/A 题目大意:给定n个邮件地址,任何电子邮件地址都将显示为“login @ domain”,其中: ...
- springboot 通过 hibernate 连接sqlserver 空间数据 位置数据
示例代码:https://github.com/bigben0123/spring-boot-spatial-example 1,配置application.properties #sqlserver ...
- Git中撤销提交
Git的几种状态 未修改 原始内容 已修改 ↓ 工 作 区 已暂存 ↓ git add 暂 存 区 已提交 ↓ git commit 本地仓库 已推送 ↓ git push 远程仓库 注意:下面所有命 ...
- C++基础知识--DAY2
昨天我们主要是讲的C++相对于C语言的变化,结尾讲述了一点引用的基础知识,要明白,引用就是对一个变量取别名,在C++中需要用指针的都可以思考是否可以用引用来代替. 1. 常引用 常引用(const s ...
- node.js(小案例)_使用mongodb对学生信息列表优化
一.前言 1.这篇文章主要对上一篇案列在操作增删改的时候使用mongodb进行优化 2.项目源码(包含上):https://github.com/4561231/crud-express-node.g ...
- RS485 / RS422
RS422可以变为RS485:A和Y短路(然后接T/R+),B和Z短路(然后接T/R-) RS485是半双工,只有两根线通信线,要么接收状态,要么发送状态 RE为低电平,作为接收器 DE为高电平,作为 ...
- IIS 错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
导致这种问题的原因是ASP.NET没有成功注册到IIS中,很有可能是先安装.Net Framework,然后安装IIS.为了避免此问题发生,要先安装IIS再安装.Net Framework. 解决方案 ...
- 2018ccpc湖南邀请赛后记
第一次出省去打邀请赛,赛前给队友定的目标是打个铜,这样奖金就可以报销我们的伙食费了 5.12 热身赛,ak的心态冲进去,爆零逃出来 (为什么热身赛没有签到题啊),出来一度以为这场比赛要打铁,毕竟老远过 ...
- Mybatis分页插件PageHelper
application.properties配置 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.suppor ...