springcloud之服务注册与发现
本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明;现在北京这边很多创业公司都开始往springcloud靠了,可能是由于文档和组件比较丰富的原因吧,毕竟是一款目前来说比较完善的微服务架构;本次分享希望能给大家带来好的帮助;
- Eureka服务中心
- Provider注册服务
- Consumer发现服务
- Eureka服务中心高可用
Eureka服务中心
就我现在了解到并且用的比较多的注册中心有zookeeper和Eureka,我的上上篇文章分享了dubbo+zookeeper来构建服务,因此本次用的是Eureka,springcloud框架也是推荐它来作为注册中心,当然可以集成其他的服注册中心,毕竟springcloud依赖于springboot来构建项目的,因此集成其他组件是很快的;首先创建注册中心项目eureka_server,通过如下引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
然后在application.yml文件中增加配置项:
server:
port:
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false #禁止自己当做服务注册
fetch-registry: false #屏蔽注册信息
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
配置完成后,还需要再启动类增加注解 @EnableEurekaServer ,设置基本完成即可运行,访问 http://localhost:2001/ 得到如下界面:

Provider注册服务
有了服务注册中心,我们还需要提供一些服务并且把这些服务注册到服务中心去,这里为了方便先创建一个服务提供者和消费者共同使用的接口模块项目eureka_api,并创建如下接口和请求返回参数实体类:
public interface UserInterface {
@PostMapping("/users")
MoRp<List<MoUser>> getUsers(MoRq rq);
@GetMapping("/msg")
String getMsg();
}
MoUser实体:
public class MoUser {
private long id;
private String userName;
private String userPwd;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
然后创建我们的服务提供端的模块eureka_provider,同样引入eureka依赖不过和server端有点区别:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
再来创建服务提供端要提供的服务UserController,并且实现我们eureka_api模块中的UserInterface接口,代码如下:
@RestController
public class UserController implements UserInterface { @Autowired
private HttpServletRequest request; @Override
public MoRp<List<MoUser>> getUsers(MoRq rq) { MoRp<List<MoUser>> rp = new MoRp<>(); List<MoUser> list = new ArrayList<>();
for (int i = ; i < ; i++) {
MoUser moUser = new MoUser();
moUser.setId(i);
moUser.setUserName("神牛" + i);
list.add(moUser);
}
rp.setT(list);
rp.setStatus(list.size() >= ? : );
rp.setMessage(list.size() >= ? "" : "暂无数据");
return rp;
} @Override
public String getMsg() { return "这里是provider,端口:"+ request.getServerPort();
}
}
这里需要注意的是Controller的两个服务接口中没有再加PostMapping或GetMapping,因为这个由被实现接口申明了;定义好了users和msg服务后,我们还需要能把他们注入到服务注册中心去,因此需要如下application.yml的配置:
spring:
application:
name: eureka-provider #服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:2001/eureka/ #服务中心地址
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
server:
port:
我们还需要在启动类增加如下标记 @EnableEurekaClient ,它表示启动eureka客户端,因为服务提供者相对服务中心来说是属于客户端的存在;当运行eureka_provider项目的时候,我们在注册中心能看到如下信息:

为了保证服务提供端接口没问题,我们可以直接点击eureka-provider:2004,然后增加要方法接口的路径我这里是:http://192.168.153.148:2004/msg,即可得到如下正常访问接口返回的信息:

Consumer发现服务
有了接口服务,我们还需要消费服务,因此创建module项目eureka_consumer,因为这里采用fegin伪客户端的方式来访问我们服务提供端,并且同样需要引入eureka的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
然后在service层定义UserService服务并且实现公共接口模块eureka_api中的接口,代码如:
@FeignClient(value = "eureka-provider")
public interface UserService extends UserInterface { }
通过FeignClient来指定调用的服务端应用名称eureka-provider,这名称对应注册在服务中心的Application目录下 ,在Controller层创建一个响应的输出UserController并分别提供两个展示的接口,代码如:
@RestController
public class UserController{ @Autowired
private UserService userService; @GetMapping("/users")
public MoRp<List<MoUser>> getUsers(MoRq rq) {
return userService.getUsers(rq);
} @GetMapping("/msg")
public String getMsg() {
return userService.getMsg();
}
}
同样Consumer端也需要在application.yml中配置一些信息:
spring:
application:
name: eureka-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:2001/eureka/ #注册中心地址
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
server:
port:
配置基本和provider端差不多,最后需要在启动类申明如下注解:
@SpringBootApplication
@EnableDiscoveryClient //消费者客户端
@EnableFeignClients //feign客户端
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
启动eureka_consumer项目后,我们能在注册中心看到它注册进来的信息:

然后通过访问eureka_consumer消费方的接口测试eureka_provider服务提供方的接口数据知否能正常响应,接口地址 http://192.168.153.148:2005/msg :

通过访问consumer得到了provider的结果,这就是服务注册和发现的基本测试流程;至于消费方怎么请求到提供方接口的,我们通过如下手工图可解:

Eureka服务中心高可用
由上面手工图来看,服务中心承担着很重要的角色,通常这种服务中心不仅仅只搭建一个,因此需要搭建一套高可用的服务中心出来;其实很简单provider和consumer配置都不用动,我们只需要在第一节点的eureka-server项目的application.yml中配置下并且在多启动几个不同端口的服务就行了(同一台服务器是多个端口,不同服务器端口可能是一样的):
server:
port:
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: true #配置高可用的时候需要开放自己注册自己
fetch-registry: true
service-url:
defaultZone: http://localhost:2002/eureka/ #注册到端口2002的eureka中
# defaultZone: http://localhost:2001/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
server:
eviction-interval-timer-in-ms: #剔除失效服务间隔
高可用配置需要注意以下几点:
- register-with-eureka: true 配置高可用的时候需要开放自己注册自己,便于多个eureka注册中心互通
- defaultZone:http://localhost:2002/eureka/ 每个注册中心都需要吧自己注册到别的注册中心去
这里我创建了两个注册中心地址分别为:http://localhost:2001/,http://localhost:2002/;由于之前provider和consumer配置的注册中心地址都是2001端口的,为了验证高可用我们需要访问2002端口注册中心,效果如:

能够看到2002端口有着2001端口同样的注册信息,当我关闭2001端口的应用时,2002还是能够查到provider和consumer的信息,更详细的配置可以参照官网说明。
springcloud之服务注册与发现的更多相关文章
- SpringCloud - 2. 服务注册 和 发现
SpringCloud 的服务注册和发现是由Eureka来完成. 1.eureka server 1.1 依赖 <dependency> <groupId>org.spring ...
- 将SpringCloud Eureka 服务注册与发现部署到docker
一.前言 最近在学习docker,顺便把之前学习的spring cloud 部署到Docker 中.至于什么是SpringCloud的服务注册与发现,什么是docker,我这里就不作赘述了.可以先去学 ...
- springcloud之服务注册与发现(Eureka)
springcloud服务注册与发现 使用Eureka实现服务治理 作用:实现服务治理(服务注册与发现) 简介: Spring Cloud Eureka是Spring Cloud Netflix项目下 ...
- springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版
新年第一篇博文,接着和大家分享springcloud相关内容:本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的 ...
- SpringCloud(二) 服务注册与发现Eureka
1.eureka是干什么的? 上篇说了,微服务之间需要互相之间通信,那么通信就需要各种网络信息,我们可以通过使用硬编码的方式来进行通信,但是这种方式显然不合适,不可能说一个微服务的地址发生变动,那么整 ...
- 微服务SpringCloud之服务注册与发现
在找.net core 微服务框架时发现了Steeltoe开源项目,它可以基于Spring Cloud实现.net core和.net Framework的微服务.正好之前也有学习过SpringBo ...
- SpringCloud Eureka服务注册及发现——服务端/客户端/消费者搭建
Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分为 Eureka Serv ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
- SpringCloud(2) 服务注册和发现Eureka Server
一.简介 EureKa在Spring Cloud全家桶中担任着服务的注册与发现的落地实现.Netflix在设计EureKa时遵循着AP原则,它基于REST的服务,用于定位服务,以实现云端中间层服务发现 ...
随机推荐
- java思维导图
https://www.edrawsoft.cn/viewer/public/s/eeca7704686971
- Snagit for mac(截图软件)中文版,截个图就是这么容易!
Snagit for mac是唯一具有内置高级图像编辑和屏幕录制功能的屏幕捕捉软件.它可以轻松抓取图像.文本和影音等多种内容形式,内置强大编辑器,捕捉.编辑一步到位.现为您带来Snagit for m ...
- Java - 数组详解(图解数组的基本操作)
目录 什么是数组 数组的定义和内存分配 数组的赋值和访问 数组的注意事项 数组的内存图解 数组的插入 数组的删除 数组的扩容 数组的反转 首先 什么是数组 数组是一组地址连续.长度固定的具有相同类型的 ...
- 从BAT这种公司平薪跳槽头条,是否值得?
有一个朋友之前就职于阿里,之前交流关于跳槽的问题,具体是这样的:阿里工作3年,拿到了头条的offer.但是非常纠结要不要接的问题.于是几个朋友聚在了一起讨论了这个问题 而且最近好多读者也在参加面试,接 ...
- 使用selenium操作ant design前端的页面,感觉页面没加载完
因需要收集页面数据,遂准备使用selenium爬取瓦斯阅读页面, 瓦斯网站使用的是ant design,元素定位非常困难,页面元素都没有ID,现在还只是能做到操作登录,不能自动打开订阅,查询某公众号, ...
- jquery ajax中success与complete的执行顺序
jquery ajax中success与complete的执行顺序 jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) ...
- Gcd&Exgcd算法学习小记
Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...
- python中的矩阵、多维数组
2. 创建一般的多维数组 import numpy as np a = np.array([1,2,3], dtype=int) # 创建1*3维数组 array([1,2,3]) type(a ...
- meta标签的用处详解
meta标签的用处: 用来描述html文档的一个属性.列如作者.日期和时间,网页描述,关键字,页面刷新等. 是文档最基本的元数据 元数据(metadata): 用来概括描述数据的一些基本数据 meta ...
- 批量引用iconfont字体图标到项目
打开https://www.iconfont.cn/网址登录后选择你需要的图标添加到购物车中 点击下载代码或者添加到项目后再下载代码,再找到之前下载的的文件,拷贝到项目中