[0081Kckwgy1gk9w7fgj9rj30z40digmk.jpg] 下面会创建2个 SpringBoot 项目: service-provider service-consumer 都整合 Nacos 然后在 service-consumer 的 Controller 中实现对 service-provider 的接口调用。 步骤: (1)创建 service-provider 与 service-consumer,整合 Nacos (2)service-provider 中添加测试接口 "/hello",service-consumer 创建服务 整合 Nacos 1.1 service-provider pom.xml <?xml version="1.0" encoding="UTF-8"?> ... 服务调用 2.1 service-provider 在 service-provider 中添加一个测试接口 /hello: ...
示例配置:service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule 示例配置:service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule最少连接数 示例配置:service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule 示例配置:service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRuleIP 示例配置:service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
@GetMapping("/hello") public String hello() { return restTemplate.getForObject("http://service-provider 下面是一个使用 Eureka 作为服务注册中心的示例:@FeignClient(name = "service-provider")public interface ServiceClient { 下面是一个使用加权轮询算法的示例:service-provider: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule 在这个示例中,配置了 service-provider 服务使用加权轮询算法进行负载均衡。
全局 随机 randomRule @Bean public RandomRule randomRule() {return new RandomRule();} 局部 配置文件: service-provider : ribbon : NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRulg service-provider :调用服务的名称 (我们去调用service-provider采用负载均衡策略) NFLoadBalancerRuleClassName: 使用的负载均衡规则,此处是随机;(包名+类名) Ribbon点对点直连: 1. #负载均衡策略 #service-provider为调用的服务的名称 service-provider : ribbon : NFLoadBalancerRuleClassName: com.netflix.loadbalancer
kubectl远程操作kubernetes的方法请参考《在windows电脑上配置kubectl远程操作kubernetes》 实战所需的注册中心和服务A对应的是两个maven工程(eureka-server和service-provider ,简介如下: 镜像名 角色 镜像对应的源码 bolingcavalry/eureka-server:0.0.1-SNAPSHOT 注册中心 eureka-server工程 bolingcavalry/service-provider :0.0.1-SNAPSHOT 服务A,提供http服务 service-provider工程 源码下载 本次实战的注册中心(eureka-server)、服务A(service-provider)、 注册中心、服务A、服务B与源码工程的对应关系如下: 角色 源码工程 备注 注册中心 eureka-server eureka注册中心服务,部署在kubernetes 服务A service-provider my-eureka --name=eurekahost --port=8080 创建服务A的deployment: kubectl run my-provider --image=bolingcavalry/service-provider
register-center 即 eureka 注册中心 service-api 为服务契约 service-consumer 为服务消费方 service-provider 为服务提供方 二、register-center 注:大家可以把service-provider多启动几个实例(端口错开,不要冲突即可),然后再观察下这个界面,可以看到注册了多个provider实例 五、service-consumer 5.1 依赖项 /order/{userId}/{orderNo} 这个用来示例如何调用service-provider中的方法,注意这里我们并没有用http://localhost:8001/user/1 来调用,而通过 http://service-provider-demo/user/ 指定service-provider的application name,让系统从注册中心去发现服务。 5.3 启动 可以从eukera中看到,service-provider与service-consumer都注册进来了。
} {{.Name}} {{.State.Status}} {{.NetworkSettings.IPAddress}} ' `sudo docker ps -a -q` bolingcavalry/service-provider :0.0.1-SNAPSHOT /springcloud_provider_3 running 172.17.0.6 bolingcavalry/service-provider:0.0.1-SNAPSHOT bolingcavalry/service-consumer:0.0.1-SNAPSHOT /springcloud_consumer_1 running 172.17.0.4 bolingcavalry/service-provider
GetMapping("/hello") public String hello() { String result = restTemplate.getForObject("http://service-provider /hello", String.class); return result; }}在上述代码中,我们注入了 RestTemplate 对象,通过访问 "http://service-provider 其中,"service-provider" 是服务提供者的名称,Ribbon 会根据配置文件中的负载均衡策略,选择其中一个实例进行请求分发。
yaml深色版本spring: application: name: service-provider server: port: 8081 eureka: client: RestTemplate restTemplate() { return new RestTemplate(); }java深色版本// 使用 Feign (推荐) @FeignClient(name = "service-provider spring: cloud: gateway: routes: - id: service-provider-route uri: lb://service-provider # lb: 负载均衡,service-provider: 服务名 predicates: - Path=/provider/** filters
Feign 作为http客户端,调用服务 @EnableFeignClients @FeignClient(value = "service-provider") public interface IProviderClient value = "/car/{id}") String getCar(@PathVariable("id") int id); } 建立一个接口,使用@FeignClient(value = "service-provider ")注解标明要调用的服务名称为service-provider;在方法上使用@RequestMapping标明要调用的接口地址。 如下: @FeignClient(value = "service-provider", fallback = IProviderClientImpl.class) public interface IProviderClient
String[] args) { SpringApplication.run(GatewayApplication.class); } } 编写路由规则 我们需要用Zuul来代理service-provider 服务 映射规则 zuul: routes: service-provider: # 这里是路由id,随意写 path: /user-service/** # 这里是映射路径 zuul: routes: service-provider: # 这里是路由id,随意写 path: /user/** # 这里是映射路径 serviceId: user-service
服务调用 : feign 和 ribbon 1. feign 创建feign客户端 @FeignClient(value = "service-provider") public interface ProductClient ribbon") public String ribbon(String name){ String result = restTemplate.getForObject("http://service-provider
public String echo(@PathVariable String str) { return restTemplate.getForObject("http://service-provider // 创建WebClient实例 .get() // 请求方式 .uri("http://service-provider org.springframework.web.bind.annotation.PathVariable; // @FeignClient(value = "服务名", path = "controller配置的路径" ) @FeignClient(value = "service-provider
@GetMapping("/hello") public String hello() { return restTemplate.getForObject("http://service-provider hello") public String hello() { ServiceInstance serviceInstance = loadBalancerClient.choose("service-provider
三、使用config-server 3.1 在之前的service-provider中添加依赖项 compile 'org.springframework.cloud:spring-cloud-starter-config 8001/refresh),可以看到 说明demo.title这个配置项被刷新了,再浏览http://localhost:8001/user/1 可以看到有变化了 但是这样显然不是个办法,比如有10个service-provider 除了做配置灰度更新,可以先刷新1台这种场景外) 4.3 集成spring cloud bus来批量刷新 spring cloud bus目前仅支持rabbitmq 及 kafka,我们以kafka为例,先在service-provider 配置好这些后,本机启动kafka,然后再重启service-provider,就会多出一个/bus/refresh的端点,即:http://xxx:port/bus/refresh ,只要向集群中的任何一台机器的
+ ":" + serverPort; } } 2)编写yml配置 #端口号 server: port: 8170 spring: application: name: service-provider server-addr: 127.0.0.1:8848 #nacos服务地址 #端口号 server: port: 8270 spring: application: name: service-provider
test</scope> </dependency> 配置application.yml 文件 server: port: 8020 spring: application: name: service-provider 使用 feign 调用服务 配置客户端 @FeignClient(value = "service-provider") public interface ProductClient { @GetMapping ") public String ribbon(String name){ String result = restTemplate.getForObject("http://service-provider
SpringApplication.run(OpenFeignDemoApplication.class, args); }}定义服务接口通过Feign客户端接口声明服务调用:@FeignClient(name = "service-provider public Client client() { return new OkHttpClient(); }}然后在接口上指定配置类:@FeignClient(name = "service-provider
4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bolingcavalry</groupId> <artifactId>service-provider </artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>service-provider eureka-server latest 80663220a5f5 35 hours ago 683 MB bolingcavalry/service-provider 0.0.1-SNAPSHOT a02f307bc1a9 22 hours ago 683 MB bolingcavalry/service-provider 0.0.1-SNAPSHOT a02f307bc1a9 47 hours ago 683 MB bolingcavalry/service-provider
搭建一个xml配置的Dubbo项目 创建三个项目 service-api 服务提供者和服务消费者共用的接口 service-consumer 服务消费者 service-provider 服务提供者 共用的接口 先在service-api定义一个公用接口 public interface DemoService { String sayHello(String name); } 服务提供者 服务提供者service-provider ("dubbo-provider.xml"); context.start(); System.in.read();//用于阻塞函数,使其一直运行 } 服务消费者 服务消费者需要调用service-provider } catch (Throwable throwable) { throwable.printStackTrace(); } } } 测试 先启动service-provider