Spring Cloud Nacos(二)
服务注册及发现
- 集成nacos
- 集成feign
新建服务客户端服务client-service
application.yml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
// 开启服务注册及发现
@EnableDiscoveryClient
// 开启Feign客户端
@EnableFeignClients
@SpringBootApplication
public class ClientServiceApplication {
// ...
}
server:
port: 9001
spring:
application:
name: client-service
cloud:
nacos:
discovery:
server-addr: 192.168.79.8:9999
service: ${spring.application.name}
group: provider-consumer
feign:
# 关闭ApacheHttpClient 开启 okhttp
httpclient:
enable: false
okhttp:
enable: true
新增FeignConfig
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLogLevel() {
return Logger.Level.FULL;
}
}
新建客户端ProductController
@RestController
@Slf4j
public class ProductController {
@Resource
ProductService productService;
@RequestMapping("/product/{id}")
public String getProduct(@PathVariable("id") String id) {
String value = productService.getProduct(id);
log.info("value={}", value);
return value;
}
@RequestMapping("/products")
public String getProduct(@RequestParam(value = "limit", defaultValue = "20") String limit, @RequestParam(value = "page", defaultValue = "1") String page) {
String value = productService.getProducts(limit, page);
log.info("value={}", value);
return value;
}
}
@Component
// product-service 为 product-service application.yml spring.cloud.nacos.discovery.service 的值,此处注意大小写
@FeignClient(value = "product-service")
public interface ProductService {
@GetMapping("/product/{id}")
String getProduct(@PathVariable("id") String id);
@GetMapping("/products")
String getProducts(@RequestParam(value = "limit", defaultValue = "20") String limit, @RequestParam(value = "page", defaultValue = "1") String page);
}
新建服务客户端服务product-service
application.yml
server:
port: 9006
spring:
application:
name: product-service
cloud:
nacos:
discovery:
server-addr: 192.168.79.8:9999
service: ${spring.application.name}
group: provider-consumer
feign:
httpclient:
enable: false
okhttp:
enable: true
compression:
request:
enabled: true
min-request-size: 2048
mime-types: application/json
response:
enabled: true
// 开启服务注册及发现
@EnableDiscoveryClient
@SpringBootApplication
public class ProductServiceApplication {
// ...
}
@Getter
public class ResultData<T> {
private T data;
private int status;
private String message;
private ResultData() {
}
private ResultData(T data) {
this.data = data;
}
public static ResultData success() {
return new ResultData();
}
public static <T> ResultData success(T data) {
return new ResultData(data);
}
public static ResultData failure(int status, String message) {
ResultData resultData = new ResultData();
resultData.status = status;
resultData.message = message;
return resultData;
}
public static ResultData failure(int status) {
return failure(status, null);
}
}
生成服务端ProductController
@RestController
@Slf4j
public class ProductController {
@Resource
ProductService productService;
@GetMapping("/products")
public ResultData<List<ProductVo>> list(@RequestParam(value = "limit", defaultValue = "20") String limit, @RequestParam(value = "page", defaultValue = "1") String page) {
log.info("ProductController#list()");
return ResultData.success(productService.getProducts());
}
@GetMapping("/product/{id}")
public ResultData<ProductVo> getProduct(@PathVariable("id") String id) {
log.info("ProductController#getProduct()");
return ResultData.success(productService.getProduct(id));
}
}
@Service
public class ProductService {
List<ProductVo> productVos = Arrays.asList(
ProductVo.builder().id("1").name("product01").build(),
ProductVo.builder().id("2").name("product02").build(),
ProductVo.builder().id("3").name("product03").build(),
ProductVo.builder().id("4").name("product04").build(),
ProductVo.builder().id("5").name("product05").build()
);
public List<ProductVo> getProducts() {
return productVos;
}
public ProductVo getProduct(String id) {
return productVos.get(Integer.parseInt(id));
}
}
启动2个product-service实例 通过设置server.port不同值
启动1个client-service实例
通过请求 client提供的接口 http://localhost:9001/product/1
将会轮训
(此处可配置为其他)远程访问 product 服务对应的远程接口
nacos注册的服务(nacos是集群的,但由于db是同一个,所以指向哪一个节点地址查看结果都相同)