前言介绍本章节提供一个基于Eurka的服务注册中心,两个服务提供者之后分别使用Ribbon、Fegin方式进行调用,测试负载均衡。 服务提供者Service Provider 本质上是一个 Eureka Client,它在服务启动时,会调用服务注册方法,向 Eureka Server注册接口服务信息,包括地址、端口、服务名、入参、返回值等。当Eureka Server收到注册信息后,会维护在自己的注册列表,如下; private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry= new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>(); 服务消费者Service Consumer 本质也是一个 Eureka Client,它在服务启动时,也会向 Eureka Server 注册服务信息。同时在启动后会从Eureka Server 上获取所有实例的注册信息,包括 IP 地址、端口等,并缓存到本地。这个获取有一定的延时,因此我们在实际开发过程中如果服务方尚未启动完成,调用方不要着急启动避免造成调用失败。 案例说明本案例在itstack-demo-springcloud-02工程中提供单个服务注册、服务提供方、Ribbon调用、Fegin调用,通过修改端口启动2个提供方来模拟测试负载均衡。 环境准备1、jdk 1.8 代码示例itstack-demo-springcloud-02├── itstack-demo-springcloud-eureka-client │ └── src │ └── main │ ├── java │ │ └── org.itstack.demo │ │ ├── web │ │ │ └── EurekaClientController.java │ │ └── EurekaClientApplication.java │ └── resources │ └── application.yml ├── itstack-demo-springcloud-eureka-server │ └── src │ └── main │ ├── java │ │ └── org.itstack.demo │ │ └── EurekaServerApplication.java │ └── resources │ └── application.yml ├── itstack-demo-springcloud-feign │ └── src │ └── main │ ├── java │ │ └── org.itstack.demo │ │ ├── service │ │ │ └── FeignService.java │ │ ├── web │ │ │ └── FeignController.java │ │ └── FeignApplication.java │ └── resources │ └── application.yml └── itstack-demo-springcloud-ribbon └── src └── main ├── java │ └── org.itstack.demo │ ├── service │ │ └── RibbonService.java │ ├── web │ │ └── RibbonController.java │ └── RibbonApplication.java └── resources └── application.yml 完整代码欢迎关注公众号:bugstack虫洞栈 | 回复“SpringCloud专题”进行下载 itstack-demo-springcloud-eureka-client | 服务提供方提供一个查询用户信息的简单方法,在配置文件中通过修改端口启动2次,模拟双实例应用,为调用方负载做准备。
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@EnableEurekaClient@RestControllerpublic class EurekaClientController {@Value("${server.port}")private int port;@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)public String queryUserInfo(@RequestParam String userId) {return "Hi 微信公众号:bugstack虫洞栈 | " + userId + " >: from eureka client port: " + port;}}
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@SpringBootApplicationpublic class EurekaClientApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientApplication.class, args);}}
server: port: 8001 / 8002spring: application:name: itstack-demo-springcloud-eureka-client eureka: client:serviceUrl: defaultZone: http://localhost:7397/eureka/ itstack-demo-springcloud-eureka-server | 单个服务注册中心服务注册中心用于承载接口提供方向上注册,同时正在调用方链接后可以获取指定应用的服务实例。
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run( EurekaServerApplication.class, args );}}
server: port: 7397eureka: instance:hostname: localhost client:registerWithEureka: falsefetchRegistry: falseserviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/spring: application:name: itstack-demo-springcloud-eureka-server itstack-demo-springcloud-feign | Feign服务调用方Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,从而让我们不再需要显式地使用这两个组件。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,我们就可以定义好 HTTP 请求的参数、格式、地址等信息。接下来,Feign 会完全代理 HTTP 的请求,我们只需要像调用方法一样调用它就可以完成服务请求。 Feign 具有如下特性: 可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@FeignClient(value = "itstack-demo-springcloud-eureka-client")public interface FeignService {@RequestMapping(value = "/api/queryUserInfo", method = RequestMethod.GET)String queryUserInfo(@RequestParam String userId);}
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@RestControllerpublic class FeignController {@Resourceprivate FeignService ribbonService;@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)public String queryUserInfo(@RequestParam String userId) {return ribbonService.queryUserInfo(userId) + " From Feign";}}
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@SpringBootApplication@EnableEurekaClient@EnableDiscoveryClient@EnableFeignClientspublic class FeignApplication {public static void main(String[] args) {SpringApplication.run(FeignApplication.class, args);}}
server: port: 9001spring: application:name: itstack-demo-springcloud-feign eureka: client:serviceUrl: defaultZone: http://localhost:7397/eureka/ itstack-demo-springcloud-ribbon | Ribbon服务调用方Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡器。它可以通过在客户端中配置 ribbonServerList 来设置服务端列表去轮询访问以达到均衡负载的作用。 当 Ribbon 与 Eureka 联合使用时,ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩展成从 Eureka 注册中心中获取服务实例列表。同时它也会用 NIWSDiscoveryPing 来取代 IPing,它将职责委托给 Eureka 来确定服务端是否已经启动。
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@Servicepublic class RibbonService {@Autowiredprivate RestTemplate restTemplate;public String queryUserInfo(String userId) {return restTemplate.getForObject("http://ITSTACK-DEMO-SPRINGCLOUD-EUREKA-CLIENT/api/queryUserInfo?userId=" + userId, String.class);}}
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@RestControllerpublic class RibbonController {@Resourceprivate RibbonService ribbonService;@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)public String queryUserInfo(@RequestParam String userId) {return ribbonService.queryUserInfo(userId) + " From Ribbon";}}
/** * 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例 * 论坛:http:// * Create by 付政委 on @2019 */@SpringBootApplication@EnableEurekaClient@EnableDiscoveryClientpublic class RibbonApplication {public static void main(String[] args) {SpringApplication.run(RibbonApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}}
server: port: 9002spring: application:name: itstack-demo-springcloud-ribbon eureka: client:serviceUrl: defaultZone: http://localhost:7397/eureka/ 测试验证1、启动服务注册中心itstack-demo-springcloud-eureka-server Hi 微信公众号:bugstack虫洞栈 | 111 >: from eureka client port: 8001 7、访问Feign服务调用放,每次刷新会看到负载均衡调用到不同端口服务:http://localhost:9001/api/queryUserInfo?userId=111 Hi 微信公众号:bugstack虫洞栈 | 111 >: from eureka client port: 8002 From Feign Hi 微信公众号:bugstack虫洞栈 | 111 >: from eureka client port: 8001 From Feign 8、访问Ribbon服务调用放,每次刷新会看到负载均衡调用到不同端口服务:http://localhost:9002/api/queryUserInfo?userId=111 Hi 微信公众号:bugstack虫洞栈 | 111 >: from eureka client port: 8001 From Ribbon Hi 微信公众号:bugstack虫洞栈 | 111 >: from eureka client port: 8002 From Ribbon 综上总结1、在使用SpringCloud时我们可以很轻松的使用到注册中心与很简单的方式去做服务调用 |
|