小程序原生组件—提升你的小程序体验
605
2022-11-17
SpringCloud——服务调用
文章目录
Spring Cloud Feign
添加User服务添加user-api模块修改ribbon-client修改config-client
Spring Cloud Feign
依赖: org.springframework.cloud:spring-cloud-starter-feign激活: @EnableFeignClients申明: @FeignClient
添加User服务
在此之前,我们改造一下工程,添加User服务模块,然后改下现有模块的名称
根据这个结构图来进行改造,这里为了简便,暂时不配置配置服务器。
添加user-api模块
作为user服务定义方
添加依赖
申明Feign客户端
@FeignClient(name = "${user.service.name}",fallback = UserServiceFallback.class)public interface UserService { @PostMapping("/user") boolean saveUser(User user); @GetMapping("/user") List
添加fallback实现
package com.learn.userapi.fallback;import com.learn.userapi.api.UserService;import com.learn.userapi.domain.User;import java.util.Collections;import java.util.List;/** * fallback实现 */public class UserServiceFallback implements UserService{ @Override public boolean saveUser(User user) { return false; } @Override public List
修改ribbon-client
将模块名改为user-service-client, 意思是user服务调用方
添加@EnableFeignClients
/** * RibbonClients定义多个Ribbon */@SpringBootApplication@RibbonClients({ @RibbonClient(name = "user-service-provider")})@EnableDiscoveryClient@EnableCircuitBreaker //使用服务短路@EnableFeignClients(clients = UserService.class) //申明UserService接口作为Feign Client调用public class RibbonClientApplication {
添加Controller:
package com.learn.ribbonclient.controller;import com.learn.ribbonclient.hystrix.UserRibbonClientHystrixCommand;import com.learn.userapi.domain.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import java.io.IOException;import java.util.List;import java.util.UUID;/** * 用户 Ribbon Controller * * @author Mercy * @since 0.0.1 */@RestControllerpublic class UserRibbonController { /** * 负载均衡器客户端 */ @Autowired private LoadBalancerClient loadBalancerClient; @Value("${service-provider.name}") private String providerServiceName; @Autowired private RestTemplate restTemplate; @GetMapping("") public String index() throws IOException { User user = new User(); user.setId(UUID.randomUUID().toString()); user.setName("Saint"); // 选择指定的 service Id ServiceInstance serviceInstance = loadBalancerClient.choose(providerServiceName); return loadBalancerClient.execute(providerServiceName, serviceInstance, instance -> { //服务器实例,获取 主机名(IP) 和 端口 String host = instance.getHost(); int port = instance.getPort(); String url = "+ host + ":" + port + "/user/save"; RestTemplate restTemplate = new RestTemplate(); return restTemplate.postForObject(url, user, String.class); }); } /** * 调用 user-service-provider "/user/list" REST 接口,并且直接返回内容 * 增加 短路功能 */ @GetMapping("/user-service-provider/user/list") public List
添加UserRibbonClientHystrixCommand
package com.learn.ribbonclient.hystrix;import com-flix.hystrix.HystrixCommand;import com-flix.hystrix.HystrixCommandGroupKey;import org.springframework.web.client.RestTemplate;import java.util.Collections;import java.util.List;public class UserRibbonClientHystrixCommand extends HystrixCommand { private final String providerServiceName; private final RestTemplate restTemplate; public UserRibbonClientHystrixCommand(String providerServiceName, RestTemplate restTemplate) { super(HystrixCommandGroupKey.Factory.asKey( "User-Ribbon-Client"), 100); this.providerServiceName = providerServiceName; this.restTemplate = restTemplate; } /** * 主逻辑实现 * * @return * @throws Exception */ @Override protected List run() throws Exception { return restTemplate.getForObject("+ providerServiceName + "/user/list", List.class); } /** * Fallback 实现 * * @return 空集合 */ protected List getFallback() { return Collections.emptyList(); }}
修改config-client
改名为user-service-provider
实现UserService,暴露HTTP REST服务
添加UserService实现类
package com.learn.configclient.service;import com.learn.userapi.api.UserService;import com.learn.userapi.domain.User;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;@Service("userService")public class UserServiceInMemory implements UserService { private Map
添加Controller
@RestControllerpublic class UserServiceProviderController implements UserService{ @Autowired @Qualifier("userService") private UserService userService; private final static Random random = new Random(); // 通过方法继承,URL 映射 :POST "/user" @Override public boolean saveUser(@RequestBody User user) { return userService.saveUser(user); } @HystrixCommand( commandProperties = { // Command 配置 // 设置操作时间为 100 毫秒 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "100") }, fallbackMethod = "fallbackForGetUsers" // 设置 fallback 方法 ) // 通过方法继承,URL 映射 :GET "/user" @Override public List
注意这里的Controller继承了
@PostMapping("/user")boolean saveUser(User user);@GetMapping("/user")List
可以省略相应的url配置。
修改配置文件
spring: application: name: user-service-providerserver: port: 9090eureka: client: service-url: defaultZone: http://localhost:8761/eureka
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~