之前了解了springcloud alibaba,开始正式学习使用和搭建spring cloud项目,
版本信息:spring boot 2.5.0 + spring cloud 2020.0.2版 +spring cloud alibaba 2021.1版
DUBBO2.7.x版本使用Nacos作为注册中心 很早之前的nacos学习笔记,那时使用的是dubbo来构建的微服务。
在使用之前需要下载安装好nacos,见:NACOS集群和单机模式启动
接下来就是如何在springcloud当中使用nacos作为注册中心
为避免麻烦,创建的时候全程点击next下一步即可,无需勾选任何的springboot相关jar。
完整pom文件如下
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.5.0
cn.hjljy.demo
springcloud
0.0.1-SNAPSHOT
springcloud
spring cloud nacos 注册中心
1.8
org.springframework.cloud
spring-cloud-dependencies
2020.0.2
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2021.1
pom
import
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
2.5.0
central
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
default
true
false
spring.cloud.nacos.discovery.service=service-a
spring.cloud.nacos.server-addr=127.0.0.1:8848
server.port=8001
@RestController
public class TestController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Im Service A " + string;
}
}
在启动类上添加 @EnableDiscoveryClient
/**
* @author hjljy
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
}
先启动nacos , 然后启动项目,最后进入nacos管理界面查看是否存在一个名为service-a的服务。存在就表示成功了。
截止到2021.5.29日,Nacos无论是官方文档还是官方实例代码,进行服务调用都是使无法Robbion+RestTemplate。但是在spring cloud 2020版当中,官方移除了Robbion,所以按照官方示例文档进行调用会报错:java.net.UnknownHostException: service-a 无法找到service-a。所以这个时候就需要新的负载均衡器来进行调用了!!!
Spring Cloud Loadbalancer 就是新的官方推荐的负载均衡器。
和服务A的创建过程,POM文件一模一样,需要新增
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
spring.cloud.nacos.discovery.service=service-b
spring.cloud.nacos.server-addr=127.0.0.1:8848
server.port=8002
同样在启动类上添加 @EnableDiscoveryClient 然后在RestTemplate上面添加注解@LoadBalanced开启负载均衡,这样就可以通过服务名进行服务调用,无需用过IP+端口的方式进行调用
/**
* @author hjljy
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceBApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ServiceBApplication.class, args);
}
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return restTemplate.getForObject("http://service-a/echo/" + string, String.class);
}
}
这里的service-a就是之前创建的服务A,无需使用IP+端口,直接使用服务名即可。
1 启动nacos
2 启动服务A
3 启动服务B
4 浏览器输入 http://127.0.0.1:8002/echo/123456 如果正确返回 Hello Im Service A 123456 表示成功!!!