学习项目代码,nacos和sentinel下载地址: 微服务学习代码.zip-互联网文档类资源-优快云文库
目录
一:测试nacos项目注册:
1.在springcloud_parent 父项目中创建新module项目:nacosclient 项目
2.修改pom.xml
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud_nacosclient</artifactId>
<parent>
<artifactId>springcloud_parent</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
3.application.properties修改配置
server.port=8989
#推荐大写
spring.application.name=NACOSCLIENT
#nacos server 地址
spring.cloud.nacos.server-addr=localhost:8848
二:项目间调用:
1.新建module项目:users和products
users项目:pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--引入openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
products项目:pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
users项目:application.properties
server.port=8990
spring.application.name=USERS
#nacos server 地址
spring.cloud.nacos.server-addr=localhost:8848
products项目:application.properties
server.port=8991
spring.application.name=PRODUCTS
#nacos server 地址
spring.cloud.nacos.server-addr=localhost:8848
products项目:ProductController
@RestController
public class ProductController {
private static final Logger log = LoggerFactory.getLogger(ProductController.class);
@Value("${server.port}")
private int port;
@GetMapping("/product")
public String product(Integer id){
log.info("id: {}",id);
return "商品服务调用返回:" + id + ",当前服务端口为:" + port;
}
}
users项目:BeansConfig ---负载均衡配置 RestTemplate
@Configuration
public class BeansConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
users项目:ProductClient ---openfeign方式调用
@FeignClient("PRODUCTS")
public interface ProductClient {
@GetMapping("/product")
String product(@RequestParam("id") Integer id);
}
users项目:UsersApplication ---添加注解 @EnableFeignClients //开启openfeign调用支持
@SpringBootApplication
@EnableFeignClients //开启openfeign调用支持
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class,args);
}
}
users项目:UserController --- 服务间通信测试
import com.baizhi.feignclients.ProductClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.discovery.DiscoveryClient;
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;
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Value("${server.port}")
private int port;
@Autowired
private DiscoveryClient discoveryClient; //服务发现客户端
@Autowired
private LoadBalancerClient loadbalanceClient; //负载均衡客户端
@Autowired
private RestTemplate restTemplate; //负载均衡注解
@Autowired
private ProductClient productClient; //openfeign方式调用
@GetMapping("/invoke")
public String invokePorduct(){
log.info("调用用户服务...");
//1.RestTemplate方式调用: 缺点:1.无法实现请求负载均衡 2.路径写死代码中不利于后续维护
// String result = new RestTemplate().getForObject("http://localhost:8991/product?id=1",String.class);
//2.RestTemplate + ribbon 方式调用 ribbon: DiscoveryClient LoadBalancerClient @LoadBalanced
//2.1:DiscoveryClient
// List<ServiceInstance> serviceInstances = discoveryClient.getInstances("PRODUCTS");
// for (ServiceInstance serviceInstance : serviceInstances) {
// log.info("服务的主机:{} 服务端口:{} 服务URI:{}",serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getUri());
// }
// String result = new RestTemplate().getForObject(serviceInstances.get(0).getUri() + "/product?id=1",String.class);
//2.2:LoadBalancerClient 已经进行负载均衡后的节点,负载均衡方式:轮询
// ServiceInstance serviceInstance = loadbalanceClient.choose("PRODUCTS");
// String result = new RestTemplate().getForObject(serviceInstance.getUri() + "/product?id=1",String.class);
//2.3: @LoadBalanced
// String result = this.restTemplate.getForObject("http://PRODUCTS/product?id=1",String.class);
//3. openfeign
String result = productClient.product(1);
log.info("商品服务调用结果: {}", result);
return result;
}
}