1. 依赖
【cloud-demo】
<!--springcloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
【eureka-server】
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
【feign-api】
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
【user-service】
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
【order-service】
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<dependency>
<groupId>com.cs.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<!--feign-httpclient-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
【gateway】
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 配置
【eureka-server】
server:
port: 10086
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
fetch-registry: false
【feign-api】
【user-service】
-- application.yml
#server:
# port: 8081
spring:
# profiles:
# active: dev
datasource:
url: jdbc:mysql://192.168.100.101:3306/cloud_user?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: userservice
cloud:
nacos:
server-addr: 192.168.100.1:80
discovery:
cluster-name: HZ
# namespace:
ephemeral: false
mybatis:
type-aliases-package: com.cs.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.cs: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
#eureka:
# client:
# service-url:
# defaultZone: http://localhost:10086/eureka
-- bootstrap.yml
server:
port: 8081
spring:
application:
name: userservice
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 192.168.100.1:80
file-extension: yaml
【order-service】
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://192.168.100.101:3306/cloud_order?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice
cloud:
nacos:
server-addr: localhost:80
discovery:
cluster-name: HZ
mybatis:
type-aliases-package: com.cs.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.cs: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
#eureka:
# client:
# service-url:
# defaultZone: http://localhost:10086/eureka
userservice:
ribbon:
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
ribbon:
eager-load:
enabled: true
clients: userservice
feign:
client:
config:
userservice:
loggerLevel: FULL
httpclient:
max-connections: 200
enabled: true
max-connections-per-route: 50
【gateway】
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:80
gateway:
routes:
- id: userservice
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- AddRequestHeader=userHeader, 11111111111111 # 添加请求头
- id: orderservice
uri: lb://orderservice
predicates:
- Path=/order/**
filters:
- AddRequestHeader=userHeader, 11111111111111 # 添加请求头
default-filters:
- AddRequestHeader=defaultHeader, 2222222222 # 添加请求头
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
3. 代码
【eureka-server】
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
【feign-api】
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
public User queryById(@PathVariable("id") Long id);
}
@Configuration
public class FeignConfiguration {
@Bean
public Logger.Level loggerLevel(){
return Logger.Level.BASIC;
}
}
【user-service】
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String shareValue;
}
//@RefreshScope
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// @Value("${pattern.dateformat}")
// private String dateformat;
@Autowired
private PatternProperties patternProperties;
/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
/**
*/
@GetMapping("/now")
public String now(@RequestHeader(value = "userHeader",required = false) String userHeader,
@RequestHeader(value = "defaultHeader",required = false) String defaultHeader) {
log.info("userHeader={}",userHeader);
log.info("defaultHeader={}",defaultHeader);
return patternProperties.getDateformat();
}
@GetMapping("/prop")
public PatternProperties prop(){
return this.patternProperties;
}
}
【order-service】
@Service
public class OrderService {
@Autowired(required = false)
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//String url ="http://localhost:8081/user/"+order.getUserId();
// String url ="http://userservice/user/"+order.getUserId();
// User user = restTemplate.getForObject(url, User.class);
User user = userClient.queryById(order.getUserId());
order.setUser(user);
// 4.返回
return order;
}
}
@EnableFeignClients(basePackages = "com.cs.feign")
@MapperScan("com.cs.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
// @Bean
// public IRule randomRule(){
// return new RandomRule();
// }
}
【gateway】
@Slf4j
@Order(-1)
@Component
public class AuthFilter implements GlobalFilter{//}, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1. 获取请求参数
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
//2. 判断-获取 auth 的参数
String auth = queryParams.getFirst("auth");
//3. 判断auth的值是否为 admin
if( "admin".equals(auth) ){
//4. 如果是,继续调用下一个拦截器
log.info("全局过滤器AuthFilter,继续调用下一个拦截器");
return chain.filter(exchange);
}
//5. 否则拦截请求(错误码、结束流程)
log.info("全局过滤器AuthFilter,拦截请求(错误码、结束流程)");
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
}
// @Override
// public int getOrder() {
// return 0;
// }
}