玩转springcloud(三):服务的提供者与调用者(注册于发现)
一、简介
上文我们实践了cloud的注册中心的单服务于多节点的搭建,房子造好了得有人来住不是,这篇我们实践下服务提供者于调用者的案例,也就是服务端和客户端的调用。
本文会设计三个module:注册中心(eureka),服务提供方(server),服务调用方(client)。其中注册中心,我们就用上文搞的,不能重复造轮子啊~~
简单说下项目执行及调用过程:首先启动注册中心,然后在启动服务端和客户端,服务端会注册到注册中心,
二、实践演练
服务提供方
我们在服务端创建一个接口可接收字符串参数,然后拼接这个参数输出("hello " + 参数 + ",this is first messge,我是8079服务哦")
1、老生常谈,先上pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2、配置文件走起
spring:
application:
name: spring-cloud-eureka-producer
server:
port: 8079
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/
参数之前都结实过啦,这里不再赘述
3、启动类添加注解@EnableDiscoveryClient
package com.oldmonk.cloud; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /**
* @program: cloud
* @description: 启动类
* @author: xujingyang
* @create: 2019-10-09 12:06
**/
@SpringBootApplication
@EnableDiscoveryClient
public class ErkaProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ErkaProducerApplication.class);
}
}
添加@EnableDiscoveryClient注解后,项目就具有了服务注册的功能。启动工程后,就可以在注册中心的页面看到SPRING-CLOUD-PRODUCER服务。
4、提供的接口服务
package com.oldmonk.cloud.controller; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: cloud
* @description: 测试接口
* @author: xujingyang
* @create: 2019-10-08 14:45
**/
@RestController
public class Hello { @RequestMapping("/hello")
public String index(String name) {
return "hello " + name + ",this is first messge,我是8079服务哦";
} }
5、启动注册中心,然后启动服务提供方,得下图

至此服务提供方就配置完成了!
服务调用方
1、老生常谈,先上pom依赖 ,与提供方是一样的
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2、配置文件走起
spring:
application:
name: spring-cloud-eureka-consumer
server:
port: 9009
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/
3、启动类添加注解
package com.oldmonk.cloud; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; /**
* @program: cloud
* @description: 启动类
* @author: xujingyang
* @create: 2019-10-09 12:06
**/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ErkaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ErkaConsumerApplication.class);
}
}
@EnableDiscoveryClient:启用服务注册与发现@EnableFeignClients:启用feign进行远程调用
Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
4、客户端接口
package com.oldmonk.cloud.controller; import com.oldmonk.cloud.service.remote.HelloRemote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: cloud
* @description: 测试接口
* @author: xujingyang
* @create: 2019-10-08 14:45
**/
@RestController
public class HelloController { @Autowired
HelloRemote remote; @RequestMapping("/hi/{name}")
public String index(@PathVariable("name") String name) {
return remote.hello(name);
} }
5、feign调用
package com.oldmonk.cloud.service.remote; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; /**
* @program: cloud-lx
* @description: 远程服务调用
* @author: xujingyang
* @create: 2019-10-09 13:07
**/
@FeignClient(name = "spring-cloud-eureka-producer")
public interface HelloRemote { @RequestMapping("/hello")
String hello(@RequestParam("name") String name);
}
参数必须保持一致与服务提供方的接口
6、启动

至此,服务调用方配置完成
测试
简单调用
1、先输入:http://localhost:8079/hello?name=xjy检查服务提供方服务是否正常

说服务提供方正常启动,提供的服务也正常。
2、浏览器中输入:http://localhost:9009/hi/xjy

说明客户端已经成功的通过feign调用了远程服务hello,并且将结果返回到了浏览器。
多节点负载均衡
1、把生产者配置文件做下改动
---
spring:
application:
name: spring-cloud-eureka-producer
profiles:
active: xjy1
server:
port: 8079
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/ ---
spring:
application:
name: spring-cloud-eureka-producer
profiles:
active: xjy2
server:
port: 8078
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/
2、controller也要修改下
package com.oldmonk.cloud.controller; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: cloud
* @description: 测试接口
* @author: xujingyang
* @create: 2019-10-08 14:45
**/
@RestController
public class Hello { @Value("${spring.profiles}")
private String profile; @RequestMapping("/hello")
public String index(String name) {
return "hello " + name + ",this is first messge,我是【" + profile + "】服务哦";
} }
2、打包,按照之前说的方式启动两次
启动2个服务形成集群注册中心,启动命令:
java -jar eureka-producer-cluster-0.0.-SNAPSHOT.jar --spring.profiles.active=xjy1
java -jar eureka-producer-cluster-0.0.-SNAPSHOT.jar --spring.profiles.active=xjy2
3、然后看到注册中心两个服务都注册进来了,加上消费方一共三个服务

4、然后在浏览器再次输入:http://localhost:9009/hi/xjy 进行测试:
第一次返回结果:hello xjy,this is first messge,我是【xjy1】服务哦
第二次返回结果:hello xjy,this is first messge,我是【xjy2】服务哦
不断的进行测试下去会发现两种结果交替出现,说明两个服务中心自动提供了服务均衡负载的功能。
如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。
三、案例源码
连接点不动时请复制粘贴此链接:https://github.com/oIdmonk/springcloud-xjy
代码基于boot2.1.9.RELEASE版本,cloudGreenwich.SR3版本
玩转springcloud(三):服务的提供者与调用者(注册于发现)的更多相关文章
- 十七、springcloud(三)服务的注册与调用
1.启动服务注册中心Eureka(见上篇) 启动成功后,暂时无服务 2.项目框架 3.创建服务提供者(spring-cloud-houge-provider)jar a.application.pro ...
- SpringCloud微服务小白入门之Eureka注册中心和服务中心搭建示例
一.注册中心配置文件 代码复制区域: spring: application: name: spring-cloud-server server: port: 7000 eureka: instanc ...
- 微服务通信之feign的注册、发现过程
前言 feign 是目前微服务间通信的主流方式,是springCloud中一个非常重要的组件.他涉及到了负载均衡.限流等组件.真正意义上掌握了feign可以说就掌握了微服务. 一.feign的使用 f ...
- SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门
1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...
- 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现
eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...
- SpringColud Eureka的服务注册与发现
一.Eureka简介 本文中所有代码都会上传到git上,请放心浏览 项目git地址:https://github.com/839022478/Spring-Cloud 在传统应用中,组件之间的调用,通 ...
- 玩转SpringCloud(F版本) 三.断路器(Hystrix)RestTemplate+Ribbon和Feign两种方式
此文章基于: 玩转SpringCloud 一.服务的注册与发现(Eureka) 玩转SpringCloud 二.服务消费者(1)ribbon+restTemplate 转SpringCloud 二.服 ...
- 三. SpringCloud服务注册与发现
1. Eureka 1.1 Eureka理解 什么是服务治理 Spring Cloud封装了Netflix公司开发的Eurkeka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之 ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
随机推荐
- InfluxDB入门教程
前言InfluxDB是一个时序性数据库,详细资料如下http://liubin.org/blog/2016/02/18/tsdb-intro/ 下载和安装LZ从官网下载的是influxdb-1.2.4 ...
- 【Fiori系列】浅谈SAP Fiori的设计美感与发展历程
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]浅谈SAP Fiori的设计美 ...
- XXE漏洞原理及利用
0x01概述 XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞.XXE扩大了攻击面. 当允许引用外部实体时,就可能导致任意文件读取.系统命令执行.内网 ...
- 在Ubuntu里搭建spark环境
注意:1.搭建环境:Ubuntu64位,Linux(也有Windows的,我还没空试) 2.一般的配置jdk.Scala等的路径环境是在/etc/profile里配置的,我自己搭建的时候发 ...
- std::replace函数
需包含头文件#include <algorithm> template <class ForwardIterator, class T> void replace (Forwa ...
- Reactor系列(十)collectMap集合
#java#reactor#collect#hashMap# 转换成Map 视频讲解: https://www.bilibili.com/video/av80048104/ FluxMonoTestC ...
- 《鸟哥的Linux私房菜:基础学习篇》读书笔记之第一部分
一.如何学习Linux 1. Linux基础知识 (1) 计算机概论与硬件相关知识. (2) 先从Linux的安装与命令学起. (3) Linux操作系统的基础技能.如用户/用户组.权限.程序等概念. ...
- MySQL函数和过程(三)
--加密32位字符select md5('123456') --获取字符串的长度(一个中文三个长度)select LENGTH('呵呵') --获取字符串字符个数select CHAR_LENGTH( ...
- linux命令(ubuntu18)记录...
1.解压.zip文件unzip unzip studentCRUD-master.zip 2.读写权限chmod指令 r表是读 (Read) .w表示写 (Write) .x ...
- [游戏复刻] 2048(2014. Android)
等哪一天我有很多很多的时间再写吧...