-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0621632
commit bbfd6ba
Showing
1 changed file
with
263 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,263 @@ | ||
# Side-B | ||
# Side-B | ||
|
||
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/c23e52d4a8fc401384b379cd7b5ac630)](https://www.codacy.com?utm_source=github.com&utm_medium=referral&utm_content=I-am-Miguel/side-b&utm_campaign=Badge_Grade) | ||
|
||
## Poposta | ||
Criar um conjunto de serviços capaz de aceitar requisições RESTful recebendo como parâmetro o nome da cidade ou as coordenadas(lat, long) e retorna como sugestão uma playList de acordo com a temperatura atual. | ||
|
||
APIs Externas: | ||
* [OpenWeatherMaps](https://openweathermap.org) | ||
* [Spotify](https://developer.spotify.com) | ||
|
||
Foram criados os seguintes Serviços: | ||
* `Cloud-config-server` | ||
* `Eureka-service` | ||
* `Music-service` | ||
* `Weather-service` | ||
* `Sugestion-service` | ||
* `Zull-server` | ||
|
||
### Obtendo o Projeto | ||
Os passos para obter o projeto em execução são os seguintes: | ||
|
||
``` | ||
$ git clone https://github.com/I-am-Miguel/side-b.git sideb_miguel | ||
$ cd sideb_miguel | ||
$ ls | ||
loud-config-server LICENSE Side-b.svg zuul-server | ||
eureka-service music-service sugestion-service | ||
README.md weather-service | ||
$ mkdir git-localconfig-repo && cd git-localconfig-repo | ||
git-localconfig-repo$ touch music-service.properties | ||
git-localconfig-repo$ touch weather-service.properties | ||
``` | ||
Após criado os arquivos `.properties` de cada serviço, será necessário adicionar as chaves de acesso de cada api sendo elas: | ||
``` | ||
#music-service.properties | ||
music-service.hostToken=https://accounts.spotify.com/api/token | ||
music-service.hostTrack=https://api.spotify.com/v1/search?q={genre}&type=track | ||
music-service.clientId=<clientID> | ||
music-service.clientSecret=<clientSecret> | ||
``` | ||
``` | ||
#weather-service.properties | ||
weather-service.city=http://api.openweathermap.org/data/2.5/weather?q={city}&appid={key} | ||
weather-service.coordinates=http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lng}&appid={key} | ||
weather-service.key=<KEY> | ||
``` | ||
|
||
### Cloud-config-server | ||
Responsável por centralizar as informações de cada serviço, através dele é gerenciado o `SPOTIFY_TOKEN`, `WEATHER_KEY` e demais chaves de acessos pessoais que não deveriam ser versionadas. | ||
|
||
Execução: | ||
``` | ||
$ cd cloud-config-server | ||
$ gradle build | ||
``` | ||
|
||
| Aplicação | Porta | | ||
| ------------- | ------------- | | ||
| Config Server | 8888 | | ||
|
||
|
||
|
||
|
||
### Eureka-service | ||
Responsável pelo `Service Registry`, realizando assim o dimensionamento dinâmico. | ||
|
||
Execução: | ||
``` | ||
$ cd eureka-service | ||
$ gradle build | ||
``` | ||
|
||
| Aplicação | Porta | | ||
| ------------- | ------------- | | ||
| Eureka Service | 8761 | | ||
|
||
### Music-service | ||
Responsável por se comunicar com o [Spotify](https://developer.spotify.com) retornando uma playList baseada nos gêneros predefinidos. | ||
|
||
Execução: | ||
``` | ||
$ cd music-service | ||
$ gradle build | ||
``` | ||
|
||
| Aplicação | Porta | | ||
| ------------- | ------------- | | ||
| Music Service | 8100, 8101, ... | | ||
|
||
|
||
Exemplo de requisição: | ||
CUrl :`curl -X GET "http://localhost:8100/genre/pop" -H "accept: application/json"` | ||
``` | ||
{ | ||
"tracks": { | ||
"href": "https://api.spotify.com/v1/search?query=pop&type=track&offset=0&limit=20", | ||
"items": [ | ||
{ | ||
"name": "Pop Out (feat. Lil TJay)" | ||
}, | ||
{ | ||
"name": "POP/STARS" | ||
}, | ||
{ | ||
"name": "pop a pill" | ||
} | ||
... | ||
] | ||
} | ||
``` | ||
UI: http://localhost:8100/swagger-ui.html | ||
|
||
|
||
### Weather-service | ||
Responsável por se comunicar com o [OpenWeatherMaps](https://openweathermap.org) retornando os dados climáticos do local pesquisado, seja por nome ou coordenadas. | ||
obs: Esse serviço representou o maior gargalo da arquitetura, cada requisição a esta API levavam em média 14000ms, por esse motivo foi utilizado o banco [Redis](https://redis.io/documentation) para armazenar essa informação em cache | ||
|
||
Execução: | ||
``` | ||
$ cd weather-service | ||
$ gradle build | ||
``` | ||
|
||
| Aplicação | Porta | | ||
| ------------- | ------------- | | ||
| Weather Service | 8000, 8001, ... | | ||
|
||
Exemplo de requisição: | ||
CUrl :`curl -X GET "http://localhost:8000/city/santos" -H "accept: application/json"` | ||
``` | ||
{ | ||
"id": "3449433", | ||
"lat": "-23.96", | ||
"lon": "-46.33", | ||
"dt": "1551883509", | ||
"cod": "200", | ||
"visibility": "10000", | ||
"name": "SANTOS", | ||
"base": "stations", | ||
"weather": [ | ||
{ | ||
"id": "800", | ||
"icon": "01d", | ||
"description": "clear sky", | ||
"main": "Clear" | ||
} | ||
], | ||
"main": { | ||
"temp": "301.08", | ||
"pressure": "1022", | ||
"humidity": "58", | ||
"temp_min": "300.93", | ||
"temp_max": "301.15" | ||
}, | ||
"sys": { | ||
"country": "BR" | ||
}, | ||
"coord": { | ||
"lat": "-23.96", | ||
"lon": "-46.33" | ||
}, | ||
"tempCelcius": 27.93 | ||
} | ||
``` | ||
UI: http://localhost:8000/swagger-ui.html | ||
|
||
|
||
|
||
### Sugestion-service | ||
Agregação dos serviços listados anteriormente, nele foi possível unir as informações de cada serviço, além de atuar como um load balancer e possuir métricas de tolerância a falhas. | ||
Execução: | ||
``` | ||
$ cd sugestion-service | ||
$ gradle build | ||
``` | ||
|
||
| Aplicação | Porta | | ||
| ------------- | ------------- | | ||
| Sugestion Service | 8200, 8201, ... | | ||
|
||
Exemplo de requisição: | ||
CUrl :`curl -X GET "http://localhost:8200/sugestion/city/santos" -H "accept: application/json"` | ||
``` | ||
{ | ||
"message": "It is a little warm out there, what do you think of the playList to cheer up. Temperature: 27.93", | ||
"results": [ | ||
"Pop Out (feat. Lil TJay)", | ||
"POP/STARS", | ||
"pop a pill", | ||
"Pop That", | ||
"Pop Style", | ||
"Pop Star", | ||
"Pop Up", | ||
"SexyBack (feat. Timbaland)", | ||
"OutRight", | ||
"Pop Style", | ||
"Love Scars Pt. 2 / Rack City", | ||
"This Is How We Party (with Icona Pop)", | ||
"Pop", | ||
"Is She Gon Pop", | ||
"Blue (Da Ba Dee) - Gabry Ponte Ice Pop Radio", | ||
"Buttercup", | ||
"Pop The Trunk", | ||
"Oh Klahoma", | ||
"Cups (Pitch Perfect’s “When I’m Gone”) - Pop Version", | ||
"Pop Style" | ||
] | ||
} | ||
``` | ||
UI: http://localhost:8200/swagger-ui.html | ||
|
||
# Tolerância a falhas | ||
Ao lidar com vários serviços é necessário garantir que nosso sistema possui tolerância a falhas, caso um serviço fique fora do ar(Serviços sempre falham :P), vejamos o que acontece caso o serviço que se comunica com o spotify fique indisponível: | ||
|
||
CUrl :`curl -X GET "http://localhost:8200/sugestion/city/santos" -H "accept: application/json"` | ||
``` | ||
{ | ||
"message": "One of our services is currently unavailable, we are very sorry, please enjoy our playlists", | ||
"results": [ | ||
"Só Quero Ver Voce / There Is Only One - Ao Vivo", | ||
"Isaias 9", | ||
"O Dia Que Será Pra Sempre", | ||
"Isaías 9 - Ao Vivo", | ||
"Até Que A Casa Esteja Cheia", | ||
"Pisaduras - Ao Vivo", | ||
"Dia Quente", | ||
"Na Gravidade da Presença", | ||
"No Teu Jardim - Ao Vivo", | ||
"Isaías 9 - Ao Vivo", | ||
"Nível Raso", | ||
"Minha Maior Riqueza", | ||
"Todo Dia Até Morrer", | ||
"Saudades de Casa", | ||
"Tão Sublime - Ao Vivo", | ||
"Mar de Vidro - Ao Vivo", | ||
"Na Gravidade da Presença", | ||
"Avançar (feat. Rodolfo Abrantes)", | ||
"Parecido Contigo", | ||
"Uma Luz Que Não Pode Se Apagar" | ||
] | ||
} | ||
``` | ||
|
||
|
||
### Zull-server | ||
Fronteira de acesso da API, o mesmo funciona como proxy de acesso `Bypass` delegando as requisições para o Sugestion-service | ||
``` | ||
$ cd zuul-server | ||
$ gradle build | ||
``` | ||
|
||
| Aplicação | Porta | | ||
| ------------- | ------------- | | ||
| Zull Service | 8080 | | ||
|
||
byPass `localhost:8080 -> localhost:8200/swagger-ui.html` | ||
|
||
A imagem a seguir ilusta a comunicação entre cada serviço da arquitetura: | ||
|
||
### Design | ||
|
||
![Arquitetura Side-B](https://github.com/I-am-Miguel/side-b/blob/master/Side-b.svg) |