本文主要是介绍[000-01-008].第02节:Consul在实际中应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我的后端学习大纲
SpringCloud学习大纲
1.使用Consul后,服务架构设计:
2.实现把支付服务provider8001注册到consul中
2.1.改POM:
<!--SpringCloud consul discovery -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2.2.改YML
2.3.改主启动类:
- 1.添加了注解:
@EnableDiscoveryClient
,开启服务发现
@SpringBootApplication
@MapperScan("com.jianqun.cloud.mapper") //import tk.mybatis.spring.annotation.MapperScan;
@EnableDiscoveryClient
public class Main8001
{public static void main(String[] args){SpringApplication.run(Main8001.class,args);}
}
2.4.验证测试:
3.实现把订单服务80注册到consul:
3.1.改POM:
<!--SpringCloud consul discovery -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
3.2.改YML:
server:port: 80spring:application:name: cloud-consumer-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}
3.3.改主启动类
- 1.添加了注解:
@EnableDiscoveryClient
,开启服务发现
@SpringBootApplication
@MapperScan("com.jianqun.cloud.mapper") //import tk.mybatis.spring.annotation.MapperScan;
@EnableDiscoveryClient
public class Main8001
{public static void main(String[] args){SpringApplication.run(Main8001.class,args);}
}
3.4.修改Controller:
-
1.未使用consul之前:在controller层上的
public static final String PaymentSrv_URL = "http://localhost:8001";
是属于写死的硬编码
-
2.使用Consul之后:我们可以把写死的ip地址改成服务的名称,即改为
public static final String PaymentSrv_URL = "http://cloud-payment-service
,在改成服务注册中心上的微服务名称后,无论ip地址怎么变化,就不会影响服务
@RestController
public class OrderController
{//public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码public static final String PaymentSrv_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称@Autowiredprivate RestTemplate restTemplate;/*** 一般情况下,通过浏览器的地址栏输入url,发送的只能是get请求* 我们模拟消费者发送get请求,but底层调用post方法,客户端消费者参数PayDTO可以不添加@RequestBody* @param payDTO* @return*/@GetMapping("/consumer/pay/add")public ResultData addOrder(PayDTO payDTO){return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class);}// 删除+修改操作作为家庭作业,O(∩_∩)O。。。。。。。@GetMapping("/consumer/pay/get/{id}")public ResultData getPayInfo(@PathVariable Integer id){return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/"+id, ResultData.class, id);}
}
3.5.验证测试
4.访问接口测试:
4.1.测试地址:
- 1.发送请求:
http://localhost/consumer/pay/get/10
,发现报错如下:
1.原因是:
consul默认是支持负载均衡的
,当通过微服务的别名进行调用的时候,默认被调用的服务应该是集群版本
,应该是由多个服务可以选择被调用,但是目前只有一个服务,所以就报错了;
2.要解决这个问题,就是在调用注册中心的服务的时候,添加上负载均衡注解@LoadBalanced
,注解@LoadBalanced
代表实现负载均衡:
4.2.配置Bean去实现负载均衡:
- 1.这里调用服务是通过RestTemplate 实现的,所以配置注解来实现负载均衡调用
@Configuration
public class ApplicationContextBean
{@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
这篇关于[000-01-008].第02节:Consul在实际中应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!